entity framework订购包括
我想尝试以下类似工作:
_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();
导致exception的部分是:
.Include(x => x.Children.OrderBy(y => y.Order).ToList())
编辑:
经过进一步观察,
_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList());
为我完成了这项工作(在最初的Factory
调用之后,没有Children.OrderBy
)。
您似乎无法在查询中对子集合进行排序。 在查询之后排序或在第二个查询中加载子项。
类似的问答在这里
扩展方法Include
只是围绕DbQuery.Include
包装器。 在内部它不执行表达式但仅解析它们,即它采用它们的成员表达式并将它们转换为路径作为字符串。 该路径用作DbQuery.Include
输入。
之前已经请求增强Include
的function,例如通过包含Where
子句来允许部分加载的集合。 订购可能是另一个变更请求。 但正如您所看到的,由于Include
的内部工作,必须重新设计整个机制以实现此类增强。 我目前的路线图上没有看到它,所以可能需要一段时间……
这永远不会有效。 EF include试图理解并将所有内容翻译成SQL,但是你想从中得到很多。 加载所有实体而不进行排序和.ToList() – 并为IEnumerable编写扩展方法以获得有序结果。
通常,如果您使用一堆包含,那是因为您需要在视图中访问子属性。 当我需要在视图中访问它时,我所做的是订购子集合。
例如,我可能为主/详细信息表单构建一些Include语句。 在最初的EF查询中排序是没有意义的。 相反,为什么不在实际访问它们时在视图级别订购这些子记录?
我可能会对多个调查问题进行调查。 当我将模型子集合传递给局部视图时,如果我想在部分视图级别以特定顺序呈现问题。
@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => x.QuestionId))
您不应将IQueryable
类型转换为IEnumerable
并调用Include
因为IEnumerable
类型不支持Include
。
简而言之,永远不要在ToList
之后调用Include
IQueryable = server side call (SQL) IEnumerable = client side (loaded in memory)