2013-03-13 124 views
24

我试图得到类似如下的工作:实体框架订购包括

_dbmsParentSections = FactoryTools.Factory.PdfSections 
         .Include(x => x.Children.OrderBy(y => y.Order).ToList()) 
         .Include(x => x.Hint).Include(x => x.Fields) 
         .Where(x => x.FormId == FormId && x.Parent == null) 
         .OrderBy(o => o.Order) 
         .ToList(); 

导致异常的部分是:

.Include(x => x.Children.OrderBy(y => y.Order).ToList()) 

编辑:

在进一步观察,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList()); 

为我完成了这项工作(在最初的Factory电话和没有Children.OrderBy之后)。

+0

感谢您提供找到了我工作藏汉 – Ronan 2016-08-31 14:42:09

回答

26

看来你不能在你的查询中排序子集合。 查询后进行排序或在第二个查询中加载子项。

类似的问题和答案here

+0

我给你的功劳,因为你是第一个回答的答案,所有三个答案几乎说同样的事 – 2013-03-14 01:11:45

+0

EF版本6.0仍然如此吗? – Brad8118 2014-10-13 17:41:57

1

这不会戈纳工作。 EF包括尝试理解并将所有内容翻译成SQL,但是您希望从中获得更多。加载所有实体而不进行排序和.ToList() - 并为IEnumerable编写扩展方法以获得有序结果。

11

扩展方法Include仅仅是围绕DbQuery.Include包装。在内部,它不会执行的表达式,但只有解析它们,即它取其成员表达式并将它们转换为字符串形式的路径。该路径用作DbQuery.Include的输入。

之前已经要求增强Include的功能,例如,通过包含Where子句来允许部分加载的集合。订购可能是另一个变更请求。但正如你所看到的,由于Include的内部工作,整个机制将不得不重新设计来实现这种增强。我没有看到它在当前road map因此它可能需要一段时间...

-2

你应该的IQueryable类型不能转换为IEnumerable和呼叫Include因为IncludeIEnumerable类型支持。

总之,永远不会调用包括后ToList

IQueryable = server side call (SQL) 
IEnumerable = client side (loaded in memory) 
+0

你的观点是真实的,但它与被问到的问题无关。我试图在'ToList'之前执行'Include' – 2016-05-10 15:56:01