65

我正在尝试使以下内容起作用:

_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)。

4

8 回答 8

53

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

类似的问题和答案在这里

于 2013-03-13T06:17:00.683 回答
28

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

 await context.Parents
    .OrderBy(parent => parent.Order)
    .Include(parent => parent.Children.OrderBy(child => child.Order))
    .ToListAsync();

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

于 2021-04-07T23:17:16.733 回答
13

扩展方法Include只是对DbQuery.Include. 在内部,它不执行表达式,而只是解析它们,即它获取它们的成员表达式并将它们转换为字符串形式的路径。该路径用作 的输入DbQuery.Include

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

于 2013-03-13T15:17:20.327 回答
5

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

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

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))
于 2019-01-24T13:39:58.703 回答
2

我使用此代码订购包含,使用选择和函数来订购集合。不是最好的,但如果子集合很小,则可以正常工作

   // 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;
    }
于 2018-11-12T00:10:56.720 回答
1

这永远行不通。EF 包含尝试理解并将所有内容转换为 SQL,但您希望从中得到很多。加载所有实体而不进行排序和 .ToList()-ing,并为 IEnumerable 编写扩展方法以获得有序结果。

于 2013-03-13T06:18:34.620 回答
1

通常,如果您使用一堆包含,那是因为您需要访问视图中的子属性。当我需要在视图中访问子集合时,我要做的是订购子集合。

例如,我可能会为主/明细表单构建一些包含语句。在最初的 EF 查询中排序是没有意义的。相反,当您实际访问它们时,为什么不在视图级别对这些子记录进行排序呢?

我可能有一个包含多个调查问题的调查。如果我想在将模型子集合传递给局部视图时在局部视图级别以特定顺序呈现问题。

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))
于 2018-05-09T21:48:50.470 回答
-4

您不应该将IQueryable类型转换为IEnumerable并调用Include,因为类型Include不支持IEnumerable

简而言之,永远不要在之后调用 IncludeToList

IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)
于 2016-05-10T08:41:14.223 回答