Entity framework 在单独查询中加载相关实体并对子集合进行排序

Entity framework 在单独查询中加载相关实体并对子集合进行排序,entity-framework,ef-code-first,Entity Framework,Ef Code First,我需要首先使用EF4.1代码检索包含在几个相关表中的数据。现在如果我用这个 return Context.Set<Entity>() .Include(x => x.Children.Select(y => y.GrandChildren.Select(z => z.Child))) .Include(x => x.SomeEntity) .Include(x => x.

我需要首先使用EF4.1代码检索包含在几个相关表中的数据。现在如果我用这个

return Context.Set<Entity>()
              .Include(x => x.Children.Select(y => y.GrandChildren.Select(z => z.Child)))
              .Include(x => x.SomeEntity)
              .Include(x => x.AnotherEntity)
              .OrderByDescending(x => x.Id)
              .FirstOrDefault();
返回上下文.Set()
.Include(x=>x.Children.Select(y=>y.sunderren.Select(z=>z.Children)))
.Include(x=>x.SomeEntity)
.包括(x=>x.AnotherEntity)
.OrderByDescending(x=>x.Id)
.FirstOrDefault();
数据提取正确,但我担心两件事:

1) 似乎没有办法对孩子/孙子进行分类

2) 数据在一个表中展平,这意味着实体(和所有其他)数据对于每个孙记录都是重复的

问题:

  • 我需要做什么才能对孩子/孙子进行排序
  • 在这种特殊情况下,第二点本身可能不是问题,因为传输的数据量不大——最多30条记录,包含30列。尽管如此,我还是想知道是否有办法分别加载Entity、子代和孙辈(3个查询),并将他们加入到客户端站点
返回的结果集需要是可更新的

我需要做什么才能对孩子/孙子进行排序

在应用程序中对它们进行排序。这是唯一可靠的方法。Include根本不允许排序,下面显示的方法不可靠,因为您无法控制EF的内部机制,并且您不能将导航属性设置为
SortedList
或其他集合来维护排序顺序(这是具有可靠排序关系的要求)

数据在一个表中展平,这意味着实体(和所有其他)数据对于每个孙记录都是重复的

这是。您可以通过关闭延迟加载并使用单独的查询加载数据来避免这种情况:

context.Configuration.LazyLoadingEnabled = false;
var parent = context.Set<Entity>().First(e => e.Name = "ABC");
// Load relations in separate query
context.Set<Child>()
       .Where(c => c.Parent.Name == "ABC")
       .OrderBy(c => c.Name) // You can at least try it but as mentioned above it may not work in all scenarios
       .Load();
// Now parent.Children collection should be filled 
context.Configuration.LazyLoadingEnabled=false;
var parent=context.Set().First(e=>e.Name=“ABC”);
//独立查询中的加载关系
context.Set()
.其中(c=>c.Parent.Name==“ABC”)
.OrderBy(c=>c.Name)//您至少可以尝试一下,但如上所述,它可能不适用于所有场景
.Load();
//现在,应该填写parent.Children集合
对于其他关系和嵌套关系,也可以采用相同的方法。关键是要正确构造子孙孙加载的
Where
条件

这并不意味着这种方法比平铺的表更快。这种方法对每个执行的查询进行单独的数据库往返,因此在较小的数据集中,展平表可以更快