2

我需要首先使用 EF 4.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();

数据已正确获取,但我担心两件事:

1)似乎没有办法对Chilren / GrandChildren进行排序

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

问题:

  • 我需要做什么才能对儿童/孙子进行排序?
  • 在这种特殊情况下,第二点本身可能不是问题,因为传输的数据量不大 - 最多 30 条记录和 30 列。不过,我想知道是否有办法分别加载实体、儿童和孙子(3 个查询),并在客户端站点上加入它们?

返回的结果集需要可更新。

4

1 回答 1

3

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

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

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

这是有效的反对意见。您可以通过关闭延迟加载并使用单独的查询来加载数据来避免它:

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 

您也可以对其他关系和嵌套关系采用相同的方法。关键是正确构建Where子孙加载条件。

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

于 2012-08-12T09:52:46.217 回答