簡體   English   中英

使用實體框架加載所有子實體

[英]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

我也嘗試使用IncludeSelect加載它,但是我得到了這個例外:

Include路徑表達式必須引用在類型上定義的導航屬性。 使用虛線路徑作為參考導航屬性,使用Select運算符作為集合導航屬性。

而且我不知道如何使用IncludeSelect加載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.

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