entity-framework - EF4 LINQ 排序父集合和所有具有急切加载 (.Include()) 的子集合

标签 entity-framework sorting linq-to-entities eager-loading

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

但它。”只是从中选择的表的别名......在本例中为“年”。有什么方法可以为子表创建别名,以便我可以在单个查询中对它们进行排序?

最佳答案

如果您需要对内部导航属性(例如模型)进行排序或过滤,那么您不能再使用 Include 方法急切地加载它们。反而,
您可以使用 EntityCollection<TEntity>.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);        
        }
    }
}

这样一来,years 对象的所有导航属性都将被排序。

关于entity-framework - EF4 LINQ 排序父集合和所有具有急切加载 (.Include()) 的子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156949/

相关文章:

c# - 与 localDb 的 Entity Framework 连接

c# - LINQ 的三元运算符问题

c# - 如何编写 SQL 交叉联接的 Linq 表达式?

javascript - 使用javascript对数组元素进行排序

c++ - 是否可以在运行时定义要在 STXXL 中排序的类型的长度?

java - 排序列表 <> 未按预期工作

c# - 当我们通过 id 获取记录时使用 Linq 查询如何将该值分配给另一列?

asp.net - 使用 Entity Framework 选择所有行

c# - 以编程方式从 Entity Framework 6 的对象上下文中获取有关索引和约束的元数据

c# - 有没有一种快速的方法来获得两个实体之间的每一个关联?