EF LINQには複数のネストされたエンティティが含まれます


155

わかりました、次の階層を持つ3レベルのエンティティがあります:コース->モジュール->章

元のEF LINQステートメントは次のとおりです。

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Single(x => x.Id == id); 

ここで、コースに関連付けられているLabという別のエンティティを含めます。

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

私は以下を試しましたが、うまくいきませんでした:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
                .Single(x => x.Id == id); 

2番目のエンティティを含めることについてのアイデアはありますか?

アドバイスや情報のいずれかが高く評価されます。ありがとう!


1
追加の.Includeインクルードがコースの孫であるという意味でない限り、別の追加は機能するはずです。これを参照するか、より良いオプションはこれです
フォンv。

回答:


234

あなただけの別を追加しようとしていますInclude

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Include(i => i.Lab)
                .Single(x => x.Id == id);

Includeはブール演算子をとらないため、ソリューションは失敗します

Include(i => i.Modules.Select(s => s.Chapters) &&          i.Lab)
                           ^^^                  ^             ^ 
                          list           bool operator    other list

更新 詳細については、LinqPadをダウンロードしてサンプルを確認してください。LinqとLambdaに慣れるための最も早い方法だと思います。

スタートのよう-との違いSelectとは、Include選択とあなたが決めることということですあなたが(投影別名)戻りたいです。Includeは、他のテーブルからのデータを含めるようにEntity Frameworkに指示するEager Loading関数です。

インクルード構文は文字列にすることもできます。このような:

           db.Courses
            .Include("Module.Chapter")
            .Include("Lab")
            .Single(x => x.Id == id);

しかし、LinqPadのサンプルはこれをよりよく説明しています。


感謝します!これについてもっと知ることができますか?IncludeとSelectの違いに特に興味があります。
アニマソラ

3
これだけが私のために働きました:.Include("Module.Chapter")。なぜそうなるのでしょうか?
Jo Smo、2015

5
@JoSmo拡張メソッドSystem.Data.Enityにアクセスするには、名前空間をインポートする必要があります。詳細はこちら
イェンスクロスター、2015

using System.Data.Entity;それをやった。ありがとう!
Jo Smo

1
素晴らしいlinqpadに言及することに賛成し、System.Data.Entityを使用するためのヒント、イェンス
マイク

38

Entity Framework Core(EF.core.ThenIncludeでは、次のレベルを含めるために使用できます。

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .ToList();

詳細:https : //docs.microsoft.com/en-us/ef/core/querying/related-data

注: 複数のが必要な場合ThenInclude()blog.Posts、を繰り返してInclude(blog => blog.Posts)別のを実行してくださいThenInclude(post => post.Other)

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Other)
 .ToList();

EF.coreでは、.Include(i => i.Modules.Select(s => s.Chapters))、特に.Include内の.Selectを実行できないようです。誰かが確認したり話したりできますか?
17

@ttugatesこの選択で何をするつもりですか?あなたがやりたいことは、まさにThenIncludeEFコアで何をするかだと思います。おそらく良い例を挙げて質問をして、答えられるようにしましょう。
Nick N.

@Nick N - Entity FrameworkのLINQのクエリ:どのようにどこに複数のナビゲーションプロパティ上へと第三ナビゲーションプロパティから選択します。私が選択するものは私が一致するものではないため、インクルードは必要ないので、質問は正接です。私の質問は「狭すぎる」かもしれませんが、どんな助けにも感謝します。
17

1
ああ。実際、.ThenInclude()は機能します。インテリセンスが関連するテーブルを表示するのに永遠にかかります。
Chris J

23

Include流暢なインターフェースの一部なので、Include互いに続く複数のステートメントを書くことができます

 db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
           .Include(i => i.Lab)
           .Single(x => x.Id == id); 

感謝します!これについてもっと学ぶことができる場所を教えてもらえますか?ありがとう!
AnimaSola 2013

1
モジュールに結合したい複数のテーブルがある場合、構文は何ですか?チャプターや他の何かにリンクしていると言っていませんか?
David Spence

.Netの流れるような部分ですか、これはインストールする必要があるライブラリですか?
codea、

19

あなたも試すことができます

db.Courses.Include("Modules.Chapters").Single(c => c.Id == id);

4
おかげで-非常に便利な文字列のドット表記
Evert

1
これは便利ですが、これを使用しない理由の1つは、後でリファクタリングを容易にすることです。ある時点で「Chapters」エンティティの名前を変更すると、他の例も自動的に名前が変更されます。もう1つは、エラーがより早く検出されることです。つまり、実行時ではなくコンパイル時です。
MGOwen

2

次のような拡張メソッドを書くことができます:

    /// <summary>
    /// Includes an array of navigation properties for the specified query 
    /// </summary>
    /// <typeparam name="T">The type of the entity</typeparam>
    /// <param name="query">The query to include navigation properties for that</param>
    /// <param name="navProperties">The array of navigation properties to include</param>
    /// <returns></returns>
    public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties)
        where T : class
    {
        foreach (var navProperty in navProperties)
            query = query.Include(navProperty);

        return query;
    }

そして、一般的な実装でもこれを次のように使用します。

string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" };

var query = context.Set<T>()
.Include(includedNavigationProperties);

私はあなたの答えを試しましたが、それ自体との無限ループのために、stackoverflowexceptionsをスローしています。
ビクトリアS.

1
@VictoriaS。、あなたはそれが本当の邪魔にならないように拡張メソッドの名前を変更することができますInclude
Mohsen Afshin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.