实体框架订购包括(Entity Framework Ordering Includes)

2019-07-21 11:50发布

我试图得到类似以下工作:

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

Answer 1:

看来你不能在查询排序的孩子集合。 无论是查询之后排序或加载孩子们在第二次查询。

类似的问题和答案在这里



Answer 2:

扩展方法Include围绕一个单纯的包装DbQuery.Include 。 内部,它不执行表达式,但只有分析它们,也就是说,它需要其成员表情,并将其转换为字符串的路径。 该路径被用作用于输入DbQuery.Include

它已被要求先来增强的功能Include通过包括,例如允许部分装载集合一个Where子句。 排序可能是另一种变更请求。 但正如你看到的,因为内部工作的Include整个机制将不得不重新设计,以实现这种改进。 我没有看到它在当前的路线图,因此可能需要一段时间...



Answer 3:

这不会戈纳工作。 EF包括正在试图理解和一切SQL翻译,但是你想从这么多。 加载所有实体不排序和.ToList() - 荷兰国际集团,并编写扩展方法的IEnumerable得到一个有序的结果。



Answer 4:

我用这个代码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;
    }


Answer 5:

一般来说,如果您使用的是一堆包括,那是因为你需要在一个视图访问子属性。 我所做的是为了孩子集合时,我需要访问它的视图。

例如,我可能会建立一些包括一个主/详细表格报表。 有没有感觉在初始EF查询订购此。 相反,为什么不能当你实际访问他们在视图级别订购这些子记录?

我可能有多个调查问题的调查。 如果我想提出问题以特定的顺序在局部视图水平做时,我传递的模型子集的局部视图。

@Html.Partial("_ResponsesPartial",Model.SurveyResponses.OrderBy(x => 
x.QuestionId))


Answer 6:

根据不同的使用情况下,你可能不需要加载单独的查询或排序之后。

在我来说,我需要他们下令在视图中循环时,所以我刚刚订购有

@foreach (var subObject in Object.SubObjects.OrderBy(x=>x.Order))


Answer 7:

你不应该的转换IQueryable类型IEnumerable ,并呼吁Include因为Include不支持IEnumerable类型。

总之,永远不会调用包括后ToList

IQueryable = server side call (SQL)
IEnumerable = client side (loaded in memory)


文章来源: Entity Framework Ordering Includes