加载所有的孩子实体与实体框架 [英] Loading all the children entities with entity framework
问题描述
我有这样
我想从一个和解的所有相关实体加载到和解的对象。
目前我能找到的唯一途径,以所有相关的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查询针对数据库:
- 的 DbSet.SqlQuery方法与实体
- 的Database.SqlQuery方法与任意类型
- Database.ExecuteSqlCommand方法任意DDL / DML
的价格
有关的情况下,当你试图装载将近整个数据库,这将是反对执行专门的存储过程好主意。
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:
- ObjectQuery.Include Method
- Explicit loading using either DbEntityEntry.Collection Method or DbEntityEntry.Reference Method along with their respective Load methods
There are also manners to write Raw SQL Queries against database:
- DbSet.SqlQuery Method deals with entities
- Database.SqlQuery Method deals with arbitrary types
- Database.ExecuteSqlCommand Method for arbitrary DDL/DML
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屋!