我试图得到类似以下工作:
_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
)。
看来你不能在查询排序的孩子集合。 无论是查询之后排序或加载孩子们在第二次查询。
类似的问题和答案在这里
扩展方法Include
围绕一个单纯的包装DbQuery.Include
。 内部,它不执行表达式,但只有分析它们,也就是说,它需要其成员表情,并将其转换为字符串的路径。 该路径被用作用于输入DbQuery.Include
。
它已被要求先来增强的功能Include
通过包括,例如允许部分装载集合一个Where
子句。 排序可能是另一种变更请求。 但正如你看到的,因为内部工作的Include
整个机制将不得不重新设计,以实现这种改进。 我没有看到它在当前的路线图,因此可能需要一段时间...
这不会戈纳工作。 EF包括正在试图理解和一切SQL翻译,但是你想从这么多。 加载所有实体不排序和.ToList() - 荷兰国际集团,并编写扩展方法的IEnumerable得到一个有序的结果。
我用这个代码POR顺序包括,使用选择和功能对集合。 是不是最好的,但做工精细,如果子集合小
// GET: api/Tareas
[HttpGet]
public IEnumerable<Tarea> GetTareas()
{
var result = _context.Tareas
.Include(p => p.SubTareas)
.Select(p => SortInclude(p));
return result;
}
private Tarea SortInclude(Tarea p)
{
p.SubTareas = (p.SubTareas as HashSet<SubTarea>)?
.OrderBy(s => s.Position)
.ToHashSet<SubTarea>();
return p;
}
一般来说,如果您使用的是一堆包括,那是因为你需要在一个视图访问子属性。 我所做的是为了孩子集合时,我需要访问它的视图。
例如,我可能会建立一些包括一个主/详细表格报表。 有没有感觉在初始EF查询订购此。 相反,为什么不能当你实际访问他们在视图级别订购这些子记录?
我可能有多个调查问题的调查。 如果我想提出问题以特定的顺序在局部视图水平做时,我传递的模型子集的局部视图。
@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x =>
x.QuestionId))
根据不同的使用情况下,你可能不需要加载单独的查询或排序之后。
在我来说,我需要他们下令在视图中循环时,所以我刚刚订购有
@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
你不应该的转换IQueryable
类型IEnumerable
,并呼吁Include
因为Include
不支持IEnumerable
类型。
总之,永远不会调用包括后ToList
IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)