13

.NET Framework(EF6)コードをASP.NETコア(EFコア)に転送すると、この問題が発生しました。 Iは、()と選択(使用EF6でEFコアを使用する接合テーブルでThenInclude()を使用する

)熱心なローディングのために:I

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

PostAuthorジャンクションテーブルであり、ジャンクションテーブルもある「AuthorInterest」ここでいくつかの例のコードでありますEF6に参加する必要はありませんでした(Selectは直接的に関心があります)。

とにかく、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のドキュメントは、私がそれを必要とせず、Authorにすぐにアクセスできることを示唆しているようですが、最後のラムダでICollectionを取得するので、明らかにSelect()が必要です。クエリ内でさらに複数のジャンクション・テーブルを調べますが、簡単にするために最初のものに焦点を当てましょう。

この作品を作成するにはどうすればよいですか?

答えて

22

が、私は最後のラムダでいるICollectionが表示されるので、私は明らかに(選択を必要とし得る)

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

paはジャンクションテーブルの要素タイプに解決されるはずですので、Authorに直接アクセスする必要があります。例えばEF6について

チェーンを含む:

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

ワウ、おかげ:

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

はEFコアに変換します。非常に不思議なことに、Visual Studioは私にpa.Authorのintellisenseを与えないでしょう(Linqメソッドを示唆しています)。 あなたの投稿の後、私はVSを無視し、すべてをコンパイルした後、魅力的に働いた。 – nikovn

+1

それは変です。私はVS2015 Update 3を使用していて、 'db.Parents.Include(p => p.Children).ThenInclude(c => c.Child).ThenInclude(c => c.Parents)のようなものを書くと、各ラムダで正しいIntellisenseサポートを取得します。 –

+0

VS2015 Ultimate Update 3もこちら。あまりにも驚くことではありません、私はコアプロジェクトに他のバグを持っています - たとえば、intellisenseによって提案された項目を選択すると、ファイルの途中に記号を書き込むときなどです。 多分プラグインです... – nikovn

関連する問題