JunctionテーブルでEFコアThenInclude()を使用する

asp.net-core asp.net-core-mvc entity-framework entity-framework-core

質問

私は私の.NET Framework(EF6)コードをASP.NET Core(EF Core)に転送しています。私はこの問題を偶然見つけました。次にコードの例を示します。

EF6では、eager-loadingにInclude()とSelect()を使用します。

return _context.Post
.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))

PostAuthorはジャンクションテーブルであり、ジャンクションテーブル "AuthorInterest"があり、EF6に関与する必要はありませんでした(Selectはa.Interestsにまっすぐに進みます)。

とにかく、私はEF7ではこれが再加工されていることを意味しています。つまり、ネストされたクエリにThenInclude()を使用する必要があります。しかしながら...

return _context.Post
  .Include(p => p.PostAuthor)
    .ThenInclude(pa => pa.Select(pa2 => pa2.Author))
...etc

上記のコードは、Select()ステートメントのために失敗します。 https://docs.efproject.net/en/latest/querying/related-data.htmlのドキュメントは、私がそれを必要とせず、著者に即座にアクセスできることを示唆しているようですが、最後のラムダでICollectionを取得します表示されるので、明らかにSelect()が必要です。クエリ内でさらに複数のジャンクション・テーブルを調べますが、簡単にするために最初のものに焦点を当てましょう。

どのように私はこの作品を作るのですか?

受け入れられた回答

私は最後のラムダでICollectionを表示するので、明らかにSelect()が必要です

いいえ、あなたはしません。 EF Core Include / ThenIncludeは、EF6で使用されるSelect / SelectMany必要性を完全に置き換えInclude 。両方とも、コレクションと参照型のナビゲーションプロパティ用に別々のオーバーロードを持っています。コレクションでoverloadを使用すると、 ThenIncludeはコレクション要素の型で動作します 。したがって、最後には常に単一のエンティティタイプになります。

あなたの場合、 paはあなたのジャンクション・テーブルの要素タイプを解決する必要があります。そのため、 Authorは直接アクセス可能でなければなりません。

例えば、EF6は鎖を含む:

.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))

EFコアに変換:

.Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests)


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ