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)