簡體   English   中英

使用實體框架加載嵌套關系

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM