だからここに契約があります-私は現在EF Core 3.1を使用していて、エンティティがあるとしましょう:
public class Entity
{
public int Id { get; set; }
public int AnotherEntityId { get; set; }
public virtual AnotherEntity AnotherEntity { get; set; }
}
DbSet<Entity> Entities
通常の方法でアクセスするときは、次のようなAnotherEntityを含めます。
_context.Entities.Include(e => e.AnotherEntity)
そしてこれはうまくいきます。なぜでしょうか?次に私は行きます:
_context.Entities.FromSqlRaw("SELECT * FROM Entities").Include(e => e.AnotherEntity)
これも機能します。どちらも、AnotherEntityで結合された同じオブジェクトのコレクションを返します。次に、SELECT * FROM Entities
spGetEntitiesという名前の同じクエリで構成されるストアドプロシージャを使用します。
_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でこれを行うことができる、またはできないという証明を見つけることができませんでしたが、誰かが私にこのアプローチの可能性のヒントを与えることができれば、それは素晴らしいでしょう。
また、ストアドプロシージャを使用して結合エンティティを取得する別の方法がある場合、問題の解決策としてそれを受け入れるでしょう。