实体框架订购包括

Ser*_*gan 37 c# linq entity-framework entity-framework-5

我想尝试以下工作:

_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();
Run Code Online (Sandbox Code Playgroud)

导致异常的部分是:

.Include(x => x.Children.OrderBy(y => y.Order).ToList())
Run Code Online (Sandbox Code Playgroud)

编辑:

经过进一步观察,

_dbmsParentSections.ForEach(x => x.Children = x.Children.OrderBy(y => y.Order).ToList());
Run Code Online (Sandbox Code Playgroud)

为我完成了这项工作(在初次Factory通话之后没有Children.OrderBy).

Ola*_*ybø 38

您似乎无法在查询中对子集合进行排序.在查询之后排序或在第二个查询中加载子项.

类似的问答在这里


小智 16

根据文档,从 EF Core 5.0 开始,您可以按包含实体的属性进行排序:

 await context.Parents
    .OrderBy(parent => parent.Order)
    .Include(parent => parent.Children.OrderBy(child => child.Order))
    .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

上面的示例按顺序对父实体进行排序,并按子实体的顺序属性对子实体进行排序。


Ger*_*old 12

扩展方法Include仅仅是一个包装器DbQuery.Include.在内部它不执行表达式但仅解析它们,即它采用它们的成员表达式并将它们转换为路径作为字符串.该路径用作输入DbQuery.Include.

之前已经请求增强功能Include,例如通过包括Where子句来允许部分加载的集合.订购可能是另一个变更请求.但正如您所见,由于Include整个机制的内部工作将不得不重新设计以实现此类增强.我目前的路线图上没有看到它,所以可能需要一段时间......


Иво*_*дев 5

根据用例,您可能不需要加载单独的查询或之后进行排序。

在我的情况下,我需要在视图中循环时订购它们,所以我只是在那里订购

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
Run Code Online (Sandbox Code Playgroud)