2017-08-29 5 views
1

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; } 

を持っている私は、しかし、それぞれ自分のefプロパティにアクセスすると、すべての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

+0

私の最初の選択ではありませんが、難しいクエリに対しては、生のSQL、ビューまたはストアドプロシージャを使用することを検討することもできます。 https://stackoverflow.com/questions/35305825/raw-sql-queries-and-entity-framework-core –

+1

https://github.com/aspnet/EntityFrameworkCore/issues/3910これにより、Include/ThenInclude 2.1のリリースの派生型について – Smit

答えて

0

このオプションがある場合は、Entity Framework Coreを使用しないことをお勧めします。ロードマップをhttps://github.com/aspnet/EntityFrameworkCore/wiki/Roadmapにチェックしてください。現在、(非常に迷惑な)欠点の名前を怠ることはありません。

.NET 4.6プロジェクトでデータアクセスレイヤーを使用し、消費量がコアに基づいている場合でも、そのプロジェクトを難なく参照することができます。

+0

私は完全なフレームワークを使用したいと思っていますが、プロジェクトは.NET Coreのみであると考えられます。これは私が書いている最も複雑なクエリーなので、Lazy Loadingを追加するまで私の現在のソリューションで暮らすことができます。 – GregoryHouseMD

+0

好奇心から、それをコアにすることを決定したのはなぜですか? – Maritim

+0

それを説明するのが大好きですが、私の決断をすることはありません:) – GregoryHouseMD

関連する問題