EF4 LINQ Ordering Parent и все дочерние коллекции с активной загрузкой (.Include ()) - PullRequest
4 голосов
/ 11 ноября 2010

Я делаю иерархическое связывание данных в сетке, и мне нужно, чтобы сервер базы данных выполнил сортировку моих объектов.Я могу легко отсортировать родительскую коллекцию, но я не могу понять, как сортировать все дочерние коллекции.У меня есть модель, в которую вложены 3 дочерние коллекции, и все эти коллекции необходимо отсортировать.

Вот пример модели того, что я пытаюсь выполнить:

    public class Year
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Make> Makes { get; set; }
}
public class Make
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Model> Models { get; set; }
}
public class Model
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Color> Colors { get; set; }
}
public class Color
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Я пытаюсь загрузить список объектов "Год".У этого есть коллекция Makes, у которой есть коллекция Моделей, у которой есть Коллекция Цветов.Мне нужно отсортировать все эти объекты на основе их свойства имени.

Я пытался сделать это:

            List<Year> years = db.Years.OrderBy("it.Name")
                                   .Include("Makes").OrderBy("it.Name")
                                   .Include("Makes.Models").OrderBy("it.Name")
                                   .Include("Makes.Models.Colors").OrderBy("it.Name")
                                   .ToList();

, но "это".является только псевдонимом для таблицы, выбранной из ... в данном случае "Годы".Есть ли способ создать псевдоним для дочерних таблиц, чтобы я мог выполнять сортировку по ним в одном запросе?

1 Ответ

9 голосов
/ 11 ноября 2010

Если вам нужно иметь Порядок или Фильтрацию для внутренних свойств навигации (например, моделей), вы больше не можете загружать их, используя метод Include. Вместо, Вы можете использовать EntityCollection .CreateSourceQuery Method вот так:

List years = db.Years.OrderBy("it.Name").ToList();
foreach(year in years) 
{
    var makesQuery = year.Makes.CreateSourceQuery().OrderBy(m => m.Name);
    year.Makes.Attach(makesQuery);  

    foreach(make in year.Makes) 
    {
        var modelsQuery = make.Models.CreateSourceQuery().OrderBy(m => m.Name);
        make.Models.Attach(modelsQuery);

        foreach(model in make.Models) 
        {
            var colQuery = model.Colors.CreateSourceQuery().OrderBy(c => c.Name);
            model.Models.Attach(colQuery);        
        }
    }
}

Таким образом, объект лет будет построен с упорядочением всех его навигационных свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...