2014-09-10 99 views
3

我返回null 3個實體有多對多的連接(表):實體框架包括性能

public class AccUserRole 
{ 
    public long Id { get; set; } 
    public string RoleName { get; set; } 
    public List<AccAdGroup> Groups { get; set; } 
    public List<AccScreen> Screens { get; set; } 
} 

public class AccAdGroup 
{ 
    public long Id { get; set; } 
    public string AdIdent { get; set; } 
    public List<AccUserRole> Roles { get; set; } 
} 



public class AccScreen 
{ 
    public long Id { get; set; } 
    public string ScreenIdent { get; set; } 
    public List<AccUserRole> Roles { get; set; } 
} 

我想獲得的所有角色(包括它們的屏幕和組)具有至少一個指定的組列表(當前用戶的組)。所以我用這個查詢:

List<AccUserRole> userRoles = (from ur in db.AccUserRoles.Include("Groups").Include("Screens") 
           from g in ur.Groups 
           where user.Groups.Contains(g.AdIdent) 
           select ur).ToList(); 

它得到正確的角色,但GroupsScreens屬性爲null。 EF看起來像使用Include和第二個from有問題。 任何有關如何包括屬性或重寫查詢的幫助將不勝感激。

回答

1

嘗試添加虛擬鍵字的類屬性,像這樣:

public class AccUserRole 
{ 
    public long Id { get; set; } 
    public string RoleName { get; set; } 
    public virtual List<AccAdGroup> Groups { get; set; } 
    public virtual List<AccScreen> Screens { get; set; } 
} 

public class AccAdGroup 
{ 
    public long Id { get; set; } 
    public string AdIdent { get; set; } 
    public virtual List<AccUserRole> Roles { get; set; } 
} 



public class AccScreen 
{ 
    public long Id { get; set; } 
    public string ScreenIdent { get; set; } 
    public virtual List<AccUserRole> Roles { get; set; } 
} 
2

移動ToList()之前包括。

select ur).Include("Groups").Include("Screens").ToList(); 

該子選擇可以消除Include效應。

如果您正在進行急切加載,則不需要virtual關鍵字。 通過添加virtual,您正在使用延遲加載,而不是急切加載。

3

Earger加載

這樣做的原因是,你只指定一個級別的包括,而你的查詢要求在第二個層次的東西。

您的包含允許您請求ur.Groupsur.Screens。 下一級別是from g in ur.Groups,並且您沒有包含該級別。 (這可能是意外的你,因爲你已經在查詢的第一部分要求所有AccUserRolse。)

當您運行查詢,你可以在開始添加其他.include,深層去兩個層次:

from ur in db.AccUserRoles 
      .Include("Groups") 
      .Include("Groups.Roles") 
      .Include("Screens") 

如果你需要去另一個層面,你只需要添加另一個包括:

from ur in db.AccUserRoles 
      .Include("Groups") 
      .Include("Groups.Roles") 
      .Include("Groups.Roles.Groups") 
      .Include("Screens") 

...等。

,如果你有一大堆的水平,以巢,這可能成爲累贅,因此另一種是使用延遲加載代替,如Praval「肖恩」 Tirubeni表明,加入virtual關鍵字來收藏您的實體。