![](/img/trans.png)
[英]Entity Framework Core 2.0.1 Eager Loading on all nested related entities
[英]Loading all the children entities with entity framework
我有這樣的數據模型
我想將對帳中的所有相關實體加載到Reconciliation對象中。
目前,我可以找到將所有相關的entites加載到單個Recon的唯一方法是多個列表。 但我想在Reconciliation
對象中加載每個相關實體。 如果可能的話,優雅的方式。
Reconciliation recon = db.Reconciliations
.Where(r => r.ReconNum == 382485).First();
List<ReconciliationDetail> reconDetails = recon.ReconciliationDetails.ToList();
List<JrnlEntryDetail> jrnlDetails = reconDetails.Select(r => r.JrnlEntryDetail).ToList();
List<JrnlEntry> jrnl = jrnlDetails.Select(j => j.JrnlEntry).ToList();
List<ARInvoice> invoices = jrnl.SelectMany(j => j.ARInvoices).ToList();
List<ARInvoiceDetail> invoicesDetail = invoices
.SelectMany(i => i.ARInvoiceDetails).ToList();
List<ARCredMemo> credmemos = jrnl.SelectMany(j => j.ARCredMemoes).ToList();
List<ARCredMemoDetail> credmemosDetail = credmemos
.SelectMany(c => c.ARCredMemoDetails).ToList();
List<IncomingPay> incomingPays = jrnl.SelectMany(j => j.IncomingPays).ToList();
List<IncomingPayDetail> incomingPaysDetail = incomingPays
.SelectMany(i => i.IncomingPayDetails).ToList();
// ... and so on for outgoing pays, AP Invoices AP Cred Memo ...etc
我也嘗試使用Include
和Select
加載它,但是我得到了這個例外:
Include路徑表達式必須引用在類型上定義的導航屬性。 使用虛線路徑作為參考導航屬性,使用Select運算符作為集合導航屬性。
而且我不知道如何使用Include
和Select
加載JrnlEntry的每個孩子
Reconciliation recon = db.Reconciliations
.Where(r => r.ReconNum == 382485)
.Include(r => r.ReconciliationDetails
.Select(d => d.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry)
.SelectMany(j => j.ARInvoices).SelectMany(i => i.ARInvoiceDetails))
編輯
管理也是這樣做但它不是很漂亮:
Reconciliation recon = db.Reconciliations
.Where(r => r.ReconNum == 382485)
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.ARInvoices.Select(i => i.ARInvoiceDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.ARCredMemoes.Select(c => c.ARCredMemoDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.IncomingPays.Select(i => i.IncomingPayDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.OutgoingPays.Select(o => o.OutgoingPayDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.APInvoices.Select(o => o.APInvoiceDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.APCredMemoes.Select(o => o.APCredMemoDetails)))
.Include(r => r.ReconciliationDetails.Select(rd => rd.JrnlEntryDetail)
.Select(jd => jd.JrnlEntry).Select(j => j.JrnlEntryDetails))
有兩種方法可以在Entity Framework中執行Eager Loading :
還有一種方法可以針對數據庫編寫Raw SQL查詢 :
對於這種情況,當您嘗試加載幾乎整個數據庫時,最好對其執行專用存儲過程。
最初嘗試使用.Include(r => r.ReconciliationDetails)
。 然后逐個添加.Select()
語句。 異常再次出現在什么時候? .SelectMany()
調用看起來有點可疑!
第二個問題可能有助於識別問題...運行包含所有ToList()
調用的代碼后,您的recon
實體是否完整? 即它的所有導航屬性是否已填充? 這應該是這種情況,因為Entity Framework的自動“修復”行為。
使用EF,有時使用多個調用而不是鏈接的Include()
調用來加載復雜的對象圖更有效。 檢查生成的SQL,看看哪種情況最有效。
不確定是否為時已晚,但您可以從構建代碼中受益,例如
var acctName = "someName";
var detailList = _repository.Include(e => e.JrnlEntryDetail).Filter(c => c.JrnlEntryDetail.Any(e => e.AcctName == acctName)).Get().ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.