當使用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
對象的列表,但訪問其e
和f
性質分別。我在查詢_db.D
的c_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();
不是我的第一選擇,但作爲替代方案,您可能會考慮使用原始sql,視圖或存儲過程來處理困難的查詢。 https://gackoverflow.com/questions/35305825/raw-sql-queries-and-entity-framework-core –
https://github.com/aspnet/EntityFrameworkCore/issues/3910這將允許你編寫Include/ThenInclude在派生類型2.1版本 – Smit