[英]Loading nested relationships using Entity Framework
我正在尋找一種通過where子句加載嵌套關系的方法。
想象一下下面的查詢示例。
select *
from directors d
inner join managers m
on d.id = m.director
inner join employees e
on m.id = e.manager
where e.name = 'John'
通過執行以下操作,很容易從這些實體加載所有信息:
ctx.Directors.Include(x => x.Managers.Select(y => y.Employees)).ToList();
但是如何在上面發布的查詢中模擬我的where子句?
知道我使用的是Entity Framework 6,是否可以這樣做? 我對此進行了研究,但沒有找到我的問題的答案。
編輯1
我問這個問題是因為我想在WCF Restful應用程序中使用它。 而且它返回了StackOverflowException,這可能是由於在為實體建立向后引用時出現了循環引用。
通過查看您的LINQ查詢,類似這樣的方法應該起作用:
from director in ctx.Directors
from manager in director.Managers
from employee in manager.Employees
where employee.Name == "John"
select director;
基本上,您應該考慮從另一個方向重新考慮您的EF查詢(假設您具有1:many關系):
ctx.Employees
.Include(x => x.Manager.Director)
.Where(x => x.Name == "John")
.ToList();
然后,您有一個名為John的員工及其相關的經理和董事的列表。
從Director入手的問題是,您可以無條件加載所有相關的Manager,或者需要將結果選擇到新的數據結構中,而不是使用默認的EF映射。
作為使用導航屬性的替代方法,您只需在linq等效項中轉換sql查詢即可。 導航屬性很棒,但請確保您確實需要它們。
var query = from director in ctx.Directors
join manager in ctx.Managers
on director.Id equals manager.DirectorId
join employee in ctx.Employees
on manager.Id equals employee.ManagerId
where employee.Name == "John"
select new
{
director,
manager,
employee,
};
此外,將您的查詢投射到某種專用的DTO肯定會解決您的循環引用
編輯嘗試不要直接序列化您的域,而是以外部圖層所需的形狀創建視圖模型。 如果確實需要將實體暴露給外界,則可能需要關閉延遲加載。 實際上,無論如何都應關閉延遲加載,因為延遲加載和序列化不能很好地混合
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.