EF6を使用しているときに遅延読み込みを使用していたので、この問題は発生しませんでしたが、EFCoreでは、EFコアを使用して継承されたすべてのクラスのすべてのプロパティを含める
私は以下のクラス構造
class A { public B b; }
class B { public ICollection<C> list_c; }
class C { public ICollection<D> list_d; }
abstract class D { public long c_id; }
class Da { public E e; }
class Db { public F f; }
を持っている私は、しかし、それぞれ自分のe
とf
プロパティにアクセスすると、すべてのD
オブジェクトのリストを必要とします。私は現時点で、私が_db.D
というクエリを実行しているところで、c_id
のクエリの最初の半分を使ってフェッチしますが、そのアプローチでは、すべてのクエリを1つ送信してc_id
と1つを取得しますタイプごとのクエリ(私は4つのタイプがあります)。
:これは私がリストを作る方法です現時点で
:
var a = await _db.As.Include(x => x.b)
.ThenInclude(x => x.list_c)
.FirstOrDefaultAsync(x=> x.Id = model.Id);
var result = await _db.Ds.OfType<Da>()
.Include(x=>x.e)
.Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
.Select(x=>(D)x)
.Concat(_db.Ds.OfType<Db>()
.Include(x=>x.f)
.Where(x=>a.b.list_c.Any(y=>y.Id == x.c_id))
.Select(x=>(D)x)).
.ToListAsync();
_db.As.Include(x => x.b)
.ThenInclude(x => x.list_c)
.ThenInclude(x => x.list_d)
// some magic here
.FirstOrDefaultAsync(x=> x.Id = model.Id);
EDIT
私の最初の選択ではありませんが、難しいクエリに対しては、生のSQL、ビューまたはストアドプロシージャを使用することを検討することもできます。 https://stackoverflow.com/questions/35305825/raw-sql-queries-and-entity-framework-core –
https://github.com/aspnet/EntityFrameworkCore/issues/3910これにより、Include/ThenInclude 2.1のリリースの派生型について – Smit