簡體   English   中英

實體框架使用導航屬性進行多級導航

[英]Entity Framework navigating using navigation properties more than one level

我有如下的實體模型類

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查詢?

您可以使用Include()來執行此操作。 例:

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

這是針對三個鏈接的實體:

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
{
    ...
}

嘗試這個:

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:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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