2017-08-29 69 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; } 

我需要的所有D對象的列表,但訪問其ef性質分別。我在查詢_db.Dc_id列表中使用下面的查詢的前半部分查詢時有工作查詢,但通過這種方法,我發送一個查詢以獲得所有c_id,然後查找一個每種類型的查詢(我有4種類型)。

我在想,如果我可以把它與一個電話,看起來像這樣的工作:

_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); 

編輯:

目前,這是我做的名單:

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(); 
+0

不是我的第一選擇,但作爲替代方案,您可能會考慮使用原始sql,視圖或存儲過程來處理困難的查詢。 https://gackoverflow.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項目中擁有數據訪問層,並且即使消耗基於Core,也可以讓您的消費項目能夠毫無困難地引用該項目。

+0

我很想能夠使用完整的框架,但該項目是假設只有.NET Core。這幾乎是我寫的最複雜的查詢,所以我可以使用我的當前解決方案,直到他們添加延遲加載。 – GregoryHouseMD

+0

出於好奇,爲什麼只做核心的決定? – Maritim

+0

很想解釋一下,但不是我做出的決定:) – GregoryHouseMD

相關問題