2013-04-17 17 views
0
一個級別

我的實體模型類如下使用導航性能超過

public partial class User 
{ 
    public User() 
    { 
     this.webpages_Roles = new HashSet<webpages_Roles>(); 
    } 

    public int UserID { get; set; } 

    public virtual ICollection<webpages_Roles> webpages_Roles { get; set; } 
} 

實體框架導航。

public partial class webpages_Roles 
{ 
    public webpages_Roles() 
    { 
     this.Users = new HashSet<User>(); 
     this.Roles_X_ApplicationModules = 
         new HashSet<Roles_X_ApplicationModules>(); 
    } 

    public int RoleId { get; set; } 


    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<Roles_X_ApplicationModules> 
            Roles_X_ApplicationModules { get; set; } 
} 

public partial class Roles_X_ApplicationModules 
{ 
    public long ID { get; set; } 
    public Nullable<int> ModuleID { get; set; } 
    public Nullable<int> RoleID { get; set; } 
    public Nullable<bool> ViewPermission { get; set; } 

    public virtual ApplicationModule ApplicationModule { get; set; } 
    public virtual webpages_Roles webpages_Roles { get; set; } 
} 

。而

public partial class ApplicationModule 
{ 
    public ApplicationModule() 
    { 
     this.Roles_X_ApplicationModules = 
          new HashSet<Roles_X_ApplicationModules>(); 
    } 

    public int ModuleID { get; set; } 

    public virtual ICollection<Roles_X_ApplicationModules> 
             Roles_X_ApplicationModules { get; set; } 
} 

你可以看到User對象有一個導航屬性webpages_Roles再次具有導航屬性Roles_X_ApplicationModules和這反過來導航到ApplicationModule ..

現在我想從用戶..獲取所有ApplicationModule ..如何使用導航屬性編寫查詢..

我想是這樣的..

var appModules = user.webpages_Roles.SingleOrDefault() 
     .Roles_X_ApplicationModules.Where(z => z.ViewPermission == true) 
     .Select(x => x.ApplicationModule); 

,但問題是這樣的,它不會發出一個查詢數據庫。它拆分查詢,以獲得webpages_RolesSingleOrDefault然後另一個查詢得到Roles_X_ApplicationModules基於RoleId和在盡頭許多查詢Roles_X_ApplicationModules匹配條件得到ApplicationModule

如何編寫LINQ查詢以便將單個SQL查詢發佈到數據庫?

回答

0

您可以使用Include()來做到這一點。 例子:

card = Cards.Include(l => l.DocumentLinks) 
      .Include(l => l.Charges.Select(ch => ch.DocumentLinks) 
      .SingleOrDefault(c=>c.Id==id); 

這是三個相互聯繫的實體:如果你想預先加載

var appModules = from u in user 
       from w in u.webpages_Roles 
       from am in w.Roles_X_ApplicationModules 
       where am.ViewPermission == true 
       select am; 

,那麼你只需要調用ToList:

public class Card 
{ 
    public Guid Id{get;set;} 
    public virtual ICollection<DocumentLink> DocumentLinks{get;set;} 
    public virtual ICollection<Charge> Charges{get;set;} 
} 

public class Charge 
{ 
    ... 
    public virtual ICollection<DocumentLink> DocumentLinks{get;set;} 
} 

public class DocumentLink 
{ 
    ... 
} 
0

試試這個

var appModules = (from u in user 
       from w in u.webpages_Roles 
       from am in w.Roles_X_ApplicationModules 
       where am.ViewPermission == true 
       select am).ToList(); 
+0

你的查詢發出更多的sql查詢es比我的做法.. :) – dotNETbeginner