簡體   English   中英

實體框架排序包括

[英]Entity Framework Ordering Includes

我正在嘗試使以下內容起作用:

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

您似乎無法對查詢中的 children 集合進行排序。 在查詢之后排序或在第二個查詢中加載子項。

類似的問題和答案在這里

根據文檔,從 EF Core 5.0 開始,您可以按包含實體的屬性進行排序:

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

上面的示例按順序對父實體進行排序,並按子實體的順序屬性對子實體進行排序。

擴展方法Include只是DbQuery.Include包裝器。 在內部,它不執行表達式而只解析它們,即它接受它們的成員表達式並將它們作為字符串轉換為路徑。 該路徑用作DbQuery.Include輸入。

之前已經請求增強Include的功能,例如通過包含Where子句來允許部分加載的集合。 訂購可能是另一個變更請求。 但是如您所見,由於Include的內部工作,整個機制將不得不重新設計以實現此類增強。 我在當前的路線圖上沒有看到它,所以可能需要一段時間......

根據用例,您可能不需要加載單獨的查詢或之后進行排序。

在我的情況下,我需要在視圖中循環時訂購它們,所以我只是在那里訂購

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

我使用此代碼來訂購包含,使用選擇和函數來訂購集合。 不是最好的,但如果子集合很小,則工作正常

   // 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 include 試圖理解所有內容並將其轉換為 SQL,但您希望從中獲得更多。 加載所有實體,無需排序和 .ToList()-ing,為 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM