Сортировка дочерних объектов при выборе родителя с использованием LINQ-to-Entities - PullRequest
3 голосов
/ 06 декабря 2009

Представьте, что у вас есть некоторые сущности 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 ]

3 голосов
/ 10 декабря 2009

Алекс Джеймс обсуждает эту проблему в этом совете .

По сути, отношения рассматриваются как неупорядоченные, согласно стандартному реляционному моделированию. Таким образом, вы не можете их отсортировать. Но вы можете проецировать на другие коллекции, которые могут быть отсортированы.

0 голосов
/ 07 декабря 2009

Один из вариантов - выполнение запроса и сортировка в памяти (например, при выводе).

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
   }
}

Есть два других варианта, которые также работают со своими плюсами и минусами:

LINQ ".Включить" порядок в подзапросе

LINQ OrderBy Name ThenBy ChildrenCollection.Name

0 голосов
/ 08 декабря 2009

вот что я сделал:

var query = from parent in context.Parents 
            select new 
            {
                 parent,
                 childs = from child in context.Child
                            orderby child.ID ascending
                            select new
                            {
                                 child
                            }
            }

Я реализовал что-то вроде этого, и у меня это получилось очень хорошо

0 голосов
/ 06 декабря 2009

Взгляните на этот пост . Вы можете попробовать что-то вроде этого:

var query = ((from parent in context.Parents
              from child in parent.Child
              orderby child.Number ascending
              select parent) as ObjectQuery<Parent>
            ).Include("Child");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...