C# 使用实体框架加载所有子实体
我有一个这样的数据模型 我想将对账中的所有相关实体加载到对账对象中 目前,我能找到的唯一方法是在多个列表中加载所有相关实体到一个侦察但我想在C# 使用实体框架加载所有子实体,c#,entity-framework-5,C#,Entity Framework 5,我有一个这样的数据模型 我想将对账中的所有相关实体加载到对账对象中 目前,我能找到的唯一方法是在多个列表中加载所有相关实体到一个侦察但我想在对账对象中加载每个相关实体。如果可能,请以优雅的方式加载 Reconciliation recon = db.Reconciliations .Where(r => r.ReconNum == 382485).First(); List<ReconciliationDetail> reconDetails = recon.Recon
对账
对象中加载每个相关实体。如果可能,请以优雅的方式加载
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
编辑
我也这么做了,但不是很漂亮:
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))
首先尝试使用
。包括(r=>r.ReconciliationDetails)
。然后逐个添加.Select()
语句。异常在什么时候重新出现?.SelectMany()
这个调用在我看来有点可疑
第二个可能有助于确定问题的问题。。。运行包含所有ToList()
调用的代码后,您的recon
实体是否完成?i、 e.是否已填充其所有导航属性?这应该是因为实体框架的自动“修复”行为
使用EF,有时通过几个调用加载复杂的对象图比链接
Include()
调用更有效。检查生成的SQL并查看在您的情况下什么是最有效的。在实体框架中有两种执行方法:
- 使用或与各自的加载方法一起显式加载
- 与实体交易
- 处理任意类型
- 对于任意DDL/DML
在这种情况下,当您试图加载几乎整个数据库时,最好对其执行专用的存储过程。不确定是否太晚,但您是否可以从构建代码(如
var acctName = "someName";
var detailList = _repository.Include(e => e.JrnlEntryDetail).Filter(c => c.JrnlEntryDetail.Any(e => e.AcctName == acctName)).Get().ToList();
请检查此线程“编辑”下的解决方案似乎是使用
.Include()
表达所需内容的正确方法。但是,一定要检查实际生成的SQL(比如通过执行Debug.WriteLine(recon.ToString()))。如果希望避免多个db调用,但希望使用更高效的SQL,请尝试中描述的方法。对于你的第二个问题,是的,在我运行包含to列表的代码之后,recon实体就完成了!伟大的否则,它可能会提示您的模型存在问题。因此,请尝试按照@motopink的建议进行查看。这里的解决方案是避免最初使用just.Include(r=>r.ReconciliationDetails)进行尝试。然后,当我像这样进入JrnlEntry时,逐个添加.Select()语句->。包括(r=>r.ReconciliationDetails.Select(rd=>rd.JrnlEntryDetail)。选择(jd=>jd.JrnlEntry)。选择(在这里只能添加一个,但仍保留5个以添加))我可以再添加一个实体,但不能添加与JrnlEntry直接相关的六个实体
var acctName = "someName";
var detailList = _repository.Include(e => e.JrnlEntryDetail).Filter(c => c.JrnlEntryDetail.Any(e => e.AcctName == acctName)).Get().ToList();