質問: だからここに契約があります-私は現在EF Core 3.1を使用していて、エンティティがあるとしましょう: ``` public class Entity { public int Id { get; set; } public int AnotherEntityId { get; set; } public virtual AnotherEntity AnotherEntity { get; set; } } ``` 通常の方法で`DbSet Entities`にアクセスするときは、次のようなAnotherEntityを含めます。 `_context.Entities.Include(e => e.AnotherEntity)` そしてこれはうまくいきます。なんでだろう?次に私は行きます: `_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)` これも機能します。どちらも、AnotherEntityで結合された同じオブジェクトのコレクションを返します。次に、spGetEntitiesという名前の同じクエリ`SELECT * FROM Entities`で構成されるストアドプロシージャを使用します。 `_context.Entities.FromSqlRaw("spGetEntities")` 何だと思う?これも機能します。同じ出力が得られますが、明らかにAnotherEntityに参加していません。ただし、次のようにインクルードを追加しようとすると、 `_context.Entities.FromSqlRaw("spGetEntities").Include(e => e.AnotherEntity)` 私は得ています: > FromSqlRawまたはFromSqlInterpolatedが、構成不可能なSQLとそれを構成するクエリで呼び出されました。呼び出し考えてみましょう`AsEnumerable`クライアント側で構図を実行するためにFromSqlRawまたはFromSqlInterpolatedメソッドの後。 > > `_context.Entities.FromSqlRaw("SELECT * FROM Entities")`と`_context.Entities.FromSqlRaw("spGetEntities")`は同じですが。 私はEF Core 3.1でこれを行うことができる、またはできないという証拠を見つけることができませんでしたが、誰かがこのアプローチの可能性のヒントを教えてくれればそれは素晴らしいでしょう。 また、ストアドプロシージャを使用して結合エンティティを取得する別の方法がある場合、問題の解決策としてそれを受け入れるでしょう。
回答: まもなく、それはできません(少なくともSqlServerの場合)。説明は、EF Coreのドキュメント- 生のSQLクエリ -LINQを使用した構成に含まれています 。 > EF Coreは提供されたSQLをサブクエリとして扱うため、LINQで構成するには、生のSQLクエリを構成可能にする必要があります。で構成できるSQLクエリは、 `SELECT`キーワードで始まります。さらに、渡されたSQLには、次のようなサブクエリで無効な文字やオプションを含めないでください。 > > * 末尾のセミコロン > * SQL Serverでは、末尾のクエリレベルのヒント(たとえば、 `OPTION (HASH JOIN)` ) > * SQL Serverでは、 `SELECT`句で`OFFSET 0 OR TOP 100 PERCENT`と共に使用されない`ORDER BY`句 > > SQL Serverでは、ストアドプロシージャの呼び出しに対する構成は許可されていないため、このような呼び出しに追加のクエリ演算子を適用しようとすると、SQLが無効になります。 `AsEnumerable`または`AsAsyncEnumerable`メソッドの直後に`FromSqlRaw`または`FromSqlInterpolated`メソッドを使用して、EF Coreがストアドプロシージャを構成しないようにします。 > > また、 `Include` / `ThenInclude`はEF Core `IQueryable<>`必要であるため、 `AsEnumerable` / `AsAsyncEnumerable`などはオプションではありません。本当に合成可能なSQLが必要なので、ストアドプロシージャはオプションではありません。 ただし、ストアドプロシージャの代わりに、テーブル値関数(TVF)またはデータベースビューを構成`select * from TVF(params)` ( `select * from TVF(params)`または`select * from db_view` )。