如何在linq中包含()嵌套的子实体

Evo*_*net 32 .net c# linq entity-framework

我如何包括孩子的孩子?

即,乔布斯有引用具有QuoteItems

var job = db.Jobs
            .Where(x => x.JobID == id)
            .Include(x => x.Quotes)
            .Include(x => x.Quotes.QuoteItems) // This doesn't work
            .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

为了更清楚 - 我正在尝试检索单个作业项目,并且它是关联的报价(一对多)和每个报价相关的QuoteItems(一个报价可以有许多QuoteItems)

我问的原因是因为在我的报价索引视图中,我试图通过SUMming小计显示每个报价的所有报价项目的总和,但是它出现为0.我正在调用这样的小计:

@item.QuoteItem.Sum(p => p.Subtotal)
Run Code Online (Sandbox Code Playgroud)

我相信我遇到这个问题的原因是我上面的Linq查询没有检索每个Quote的相关QuoteItems.

Mat*_*und 43

为了得到一份工作并热切地加载所有引号和引用项,你写道:

var job = db.Jobs
        .Include(x => x.Quotes.Select(q => q.QuoteItems))
        .Where(x => x.JobID == id)
        .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

您可能需要SelectMany而不是SelectQuoteItems也是一个集合.

别人注意; 强类型Include()方法是一种扩展方法,因此您需要包含using System.Data.Entity;在文件的顶部.


fli*_*erg 21

这将完成工作(假设我们正在讨论实体框架,并且您想要获取子实体):

var job = db.Jobs
            .Include(x => x.Quotes) // include the "Job.Quotes" relation and data
            .Include("Quotes.QuoteItems") // include the "Job.Quotes.QuoteItems" relation with data
            .Where(x => x.JobID == id) // going on the original Job.JobID
            .SingleOrDefault(); // fetches the first hit from db.
Run Code Online (Sandbox Code Playgroud)

有关该Include声明的更多信息,请查看:http://msdn.microsoft.com/en-us/library/bb738708(v = vs.110).aspx

  • 我认为这很好,但是iirc,你不需要第一个.include行,因为它将作为第二个包含行的一部分包含在内,所以你只需要反射调用,而不是第一个引号调用. (3认同)
  • 这是一个非常奇怪的答案。 (2认同)

Tzv*_*nov 8

@flindeberg在这里说,这对我来说很有用.刚添加检查列表中每个父项是否有子项

 List<WCF.DAL.Company> companies = dbCtx.Companies.Where(x=>x.CompanyBranches.Count > 0)
                            .Include(c => c.CompanyBranches)
                            .Include("CompanyBranches.Address")
                            .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 如果你不使用魔术字符串会更好:`.Include($ {nameof(Companies.CompanyBranches)}.{nameof(CompanyBranch.Address)})` (7认同)

Men*_*heh 6

接受的答案中的方法在.NET Core中不起作用。

对于使用.NET Core的任何人,虽然魔术字符串方法确实有效,但更干净的方法是ThenInclude

var job = db.Jobs
        .Where(x => x.JobID == id)
        .Include(x => x.Quotes)
        .ThenInclude(x => x.QuoteItems)
        .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

(资源)

  • 这对我来说是正确的答案。我有孩子的孩子,似乎你可以把这个嵌套得很深,而“魔力绳”不起作用。 (2认同)