web-dev-qa-db-ja.com

linqにネストされた子エンティティを含める方法

子エンティティの子を含めるにはどうすればよいですか?

すなわち、ジョブにはQuoteItemsを持つQuotesがあります

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

明確にするために-単一のジョブアイテムを取得しようとしていますが、関連する見積(1対多)と、各見積に対して関連するQuoteItems(1つの見積りには多くのQuoteItemsを含めることができます)

私が求めている理由は、見積索引ビューで、小計を合計することによって各見積のすべての見積品目の合計を表示しようとしているが、0として表示されるためです。小計を次のように呼び出しています。

@item.QuoteItem.Sum(p => p.Subtotal)

私がこの問題を抱えている理由は、上記のLinqクエリが各Quoteに関連付けられたQuoteItemsを取得していないからだと思います。

27
Evonet

これは仕事をします(エンティティフレームワークについて話しているので、子エンティティを取得したい場合):

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.

Includeステートメントの詳細については、以下を参照してください。 http://msdn.Microsoft.com/en-us/library/bb738708(v = vs.110).aspx =

18
flindeberg

@flindebergがここで言ったように、これは私のためにトリックをしました。リスト内の各親アイテムに子があるかどうかのチェックを追加しました

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

受け入れられた回答 のメソッドは、.NET Coreでは機能しません。

.NET Coreを使用している場合、 magic string の方法は機能しますが、よりクリーンな方法はThenIncludeです:

var job = db.Jobs
        .Where(x => x.JobID == id)
        .Include(x => x.Quotes)
        .ThenInclude(x => x.QuoteItems)
        .SingleOrDefault();

(ソース)

2
Menasheh