Сортировка дочерних объектов при выборе родителя с использованием LINQ-to-Entities
Представьте, что у вас есть некоторые сущности Entity Framework, которые выглядят следующим образом (очевидно, не эти конкретные классы, а автоматически сгенерированные со всей версией Entity Framework; это только для иллюстрации):
public class Parent
{
public int ID { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public int ID { get; set; }
public Parent Parent { get; set; }
public int Number { get; set; }
}
У меня есть запрос LINQ, который выглядит следующим образом:
from parent in context.Parents.Include("Child")
select parent
Тем не менее, это возвращает список родителей, где дети находятся в порядке идентификации. Я хочу, чтобы дети сортировались по их свойству Number в пределах их Parent. Как это может быть сделано?
Редактировать: пояснение: идея состоит в том, чтобы запрос был скрыт за вызовом метода (на фасаде слоя), который просто возвращает IList<Parent>
, Это делает использование таких решений, как запросы анонимных классов и ручную сортировку, болезненным (по сравнению с каким-либо решением для панацеи, где вы можете просто сделать это в запросе или что-то в этом роде).
4 ответа
Алекс Джеймс обсуждает эту проблему в этом совете.
По сути, отношения рассматриваются как неупорядоченные, согласно стандартному реляционному моделированию. Так что вы не можете их отсортировать. Но вы можете проецировать на другие коллекции, которые могут быть отсортированы.
Посмотрите на этот пост. Вы можете попробовать что-то вроде этого:
var query = ((from parent in context.Parents
from child in parent.Child
orderby child.Number ascending
select parent) as ObjectQuery<Parent>
).Include("Child");
Вот что я сделал:
var query = from parent in context.Parents
select new
{
parent,
childs = from child in context.Child
orderby child.ID ascending
select new
{
child
}
}
Я реализовал что-то вроде этого, и это работало очень хорошо для меня
Одним из вариантов является выполнение запроса и сортировка в памяти (например, на выходе).
var parents = context.Parents.Include("Child").ToList(); //note that ToList is here just to execute the query and get the objects in memory
foreach (var p in parents)
{
//do something with parent item
foreach (var c in p.Child.OrderBy(c => c.Number))
{
/do something with the child item
}
}
Есть два других варианта, которые также работают со своими плюсами и минусами: