加载所有的孩子实体与实体框架 [英] Loading all the children entities with entity framework

查看:486
本文介绍了加载所有的孩子实体与实体框架的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样





我想从一个和解的所有相关实体加载到和解的对象。



目前我能找到的唯一途径,以所有相关的entites装载到一个单一的侦察是在多个列表。 但是我想每一个相关实体加载一个对帐对象。如果有可能在一个优雅的方式。

 协调侦察= db.Reconciliations 
。凡(R = GT; r.ReconNum == 382485)。首先();

名单,LT; ReconciliationDetail> reconDetails = recon.ReconciliationDetails.ToList();
名单,LT; JrnlEntryDetail> jrnlDetails = reconDetails.Select(R => r.JrnlEntryDetail).ToList();
名单,LT; JrnlEntry> jrnl = jrnlDetails.Select(J => j.JrnlEntry).ToList();

名单,LT; ARInvoice>发票= jrnl.SelectMany(J => j.ARInvoices).ToList();
名单,LT; ARInvoiceDetail> invoicesDetail发票=
.SelectMany(I => i.ARInvoiceDetails).ToList();

名单,LT; ARCredMemo> credmemos = jrnl.SelectMany(J => j.ARCredMemoes).ToList();
名单,LT; ARCredMemoDetail> credmemosDetail = credmemos
.SelectMany(C => c.ARCredMemoDetails).ToList();

名单,LT; IncomingPay> incomingPays = jrnl.SelectMany(J => j.IncomingPays).ToList();
名单,LT; IncomingPayDetail> incomingPaysDetail = incomingPays
.SelectMany(I => i.IncomingPayDetails).ToList();

// ...等等传出支付,AP发票AP中房备注...等

我也试图与加载它包含选择,但我得到这个例外



包括路径表达式必须引用的类型定义的导航属性。用虚线路径参考导航属性和集合导航属性选择运营商。



和我不明白,我可以如何使用加载JrnlEntry的每一个孩子的包含选择

 协调侦察= db.Reconciliations 
。凡(R = GT; r.ReconNum == 382485)
.INCLUDE(R = GT; r.ReconciliationDetails
。选择(D = > d.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)
.SelectMany(J => j.ARInvoices).SelectMany(I => i.ARInvoiceDetails))

修改



好不容易才做这种方式太多,但它不是很漂亮:

 协调侦察= db.Reconciliations 
。凡( R => r.ReconNum == 382485)
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry )。选择(J => j.ARInvoices.Select(I => i.ARInvoiceDetails)))
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)。选择(J => j.ARCredMemoes.Select(C => c.ARCredMemoDetails) ))
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)。选择(J =>Ĵ .IncomingPays.Select(I => i.IncomingPayDetails)))
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT ; jd.JrnlEntry)。选择(J => j.OutgoingPays.Select(O = GT; o.OutgoingPayDetails)))
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; RD .JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)。选择(J => j.APInvoices.Select(O = GT; o.APInvoiceDetails)))
.INCLUDE相关(r = > r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)。选择(J => j.APCredMemoes.Select(O =≠0。 APCredMemoDetails)))
.INCLUDE(R = GT; r.ReconciliationDetails.Select(RD = GT; rd.JrnlEntryDetail)
。选择(JD = GT; jd.JrnlEntry)。选择(J => j.JrnlEntryDetails))


解决方案

有两种方法来执行 预先加载 在实体框架:





有风度也写生SQL查询针对数据库:





有关的情况下,当你试图装载将近整个数据库,这将是反对执行专门的存储过程好主意。


I have a data model like this

I would like to load all the related entities from a Reconciliation into a Reconciliation object.

For now the only way I could find to load all the related entites to a single Recon is in multiple Lists. But I want to load every related entities in a Reconciliation object. If possible in an elegant way.

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

I have also tried to load it with Include and Select but I get this exception :

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

And I don't get how I could load every childs of JrnlEntry using Include and Select

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

Edit

Managed to do it this way too but it's not very beautiful :

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

解决方案

There are two ways to perform Eager Loading in Entity Framework:

There are also manners to write Raw SQL Queries against database:

For the case, when you're attempting to load nearly entire database, it would be good idea to execute dedicated store procedure against it.

这篇关于加载所有的孩子实体与实体框架的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆