2012-08-11 49 views
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)似乎没有办法孩子/孙子排序

2)

    012:数据在一个表中,这意味着实体(和所有其他)数据被复制为孙辈每人记录

    问题扁平

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

返回的结果集需要更新。

回答

3

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

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

数据在一个表中,这意味着实体(和所有其他)数据被复制为孙辈每人记录

这是valid objection平坦化。您可以通过关闭延迟加载避免它,并使用单独的查询来加载数据:

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条件。

这并不意味着这种方法会更快,扁平化表。这种方法为每个已执行的查询分别执行数据库往返传递,因此扁平化表可以在较小的数据集中更快。