EF4 LINQ使用Eager Loading(.Include())对父级和所有子集合进行排序

Tra*_*vis 4 sorting linq-to-entities entity-framework eager-loading

我在网格上进行分层数据绑定,我需要让数据库服务器对我的对象执行排序.我可以轻松地对父集合进行排序,但我似乎无法弄清楚如何对所有子集合进行排序.我有一个模型,其中嵌套了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; }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试加载"年"对象列表.这里有一系列Makes,它有一系列具有颜色集合的模型.我需要根据name属性对所有这些对象进行排序.

我试过这样做:

            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();
Run Code Online (Sandbox Code Playgroud)

但它." 只是从...中选择的表的别名,在这种情况下是"年".有没有办法为子表创建一个别名,所以我可以在一个查询中对它们进行排序?

Mor*_*avi 9

如果您需要对内部导航属性(例如模型)进行排序或过滤,那么您无法再使用Include方法加载它们.相反,您可以像这样使用EntityCollection <TEntity> .CreateSourceQuery方法:

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);        
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,将构建年份对象,并对其所有导航属性进行排序.

  • 不,它不适用于POCO,但有一种完美的方法可以通过使用新的*Query()*方法在CTP5中实现这一点:`context.Entry(year).Collection(y => y.Makes).Query( ).OrderBy(m => m.Name).Load();` (2认同)
  • 是的,这与"CreateSourceQuery"方式完全相同,因为我们调用`Attch`方法时会发生第二次DB. (2认同)