实体框架使用导航属性导航多个级别

时间:2013-04-17 10:00:25

标签: c# .net entity-framework ef-code-first

我有实体模型类如下

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

现在我想从User获取所有ApplicationModule。如何使用导航属性编写查询..

我试过这样的事情......

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

但问题是,它不会向数据库发出单个查询。它将查询拆分为webpages_Roles SingleOrDefault,然后另一个查询根据Roles_X_ApplicationModules获取RoleId,最后查询Roles_X_ApplicationModules匹配条件以获得ApplicationModule

如何编写LINQ查询以便向数据库发出单个SQL查询?

2 个答案:

答案 0 :(得分:0)

您可以使用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
{
    ...
}

答案 1 :(得分: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:

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