ASP.NET EF6查询模型

时间:2014-12-31 04:08:14

标签: c# asp.net linq entity-framework

我有以下型号。每个模块都有一个嵌套的类型为module的子集合。每个模块还有一组权限。

[DataContract(IsReference = true)]
public class Module
{
    [Key]
    [DataMember]
    public Guid ModuleId { get; set; }

    [Required]
    [StringLength(100)]
    [DataMember]
    public string Title { get; set; }

    [StringLength(100)]
    [DataMember]
    public string Description { get; set; }

    [StringLength(50)]
    [DataMember]
    public string Icon { get; set; }

    [Required]
    [RegularExpression(@"[^\s]+")]
    [StringLength(50)]
    [DataMember]
    public string Route { get; set; }

    [DataMember]
    public ICollection<Permission> Permissions { get; set; }

    [DataMember]
    public Guid? ParentModuleId { get; set; }

    [ForeignKey("ParentModuleId")]
    [DataMember]
    public virtual ICollection<Module> Children { get; set; }
}
[DataContract(IsReference = true)]
public class Permission
{
    [Key]
    [DataMember]
    public Guid PermissionId { get; set; }

    [Required]
    [StringLength(100)]
    [DataMember]
    public string Role { get; set; }

    [DataMember]
    public Guid ModuleId { get; set; }

    [ForeignKey("ModuleId")]
    [DataMember]
    public Module Module { get; set; }
}

我有一个Query All函数,如下所示,它将正确返回所有root及其子元素。

public override IQueryable<Module> All()
    {
        return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null);
    }

现在,我想返回与其子节点相同的root列表,其中包含Permission&#34; User&#34;。我该怎么做呢。这就是我到目前为止所拥有的。这是正确的方法吗?请帮忙。

return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null).Include(p => p.Permissions).Where(s => s.Permissions.Any(r=>r.Role=="User"));
顺便说一句,我不知道如何正确使用这些功能,例如include,where,any,选择很多功能。任何教程或书籍都是值得赞赏的。我找不到任何关于此的好教程,因为我不知道要搜索的关键字。是EF还是LINQ。

1 个答案:

答案 0 :(得分:0)

Include方法告诉实体框架在进入数据库时​​填充该特定的导航属性以恢复记录(即,它急切地加载数据而不是使用延迟加载,这将需要EF去稍后回到数据库)。它没有做任何过滤。所有这些都是通过“Where”方法完成的。

要对所有孩子进行过滤,你必须做以下两件事之一:

1)在SQL中创建一个公用表表达式,它将以递归方式获取特定模块的所有子节点,将该CTE放在SQL视图中,将EF实体映射到该视图,然后查询该视图,包括{ {1}} Join只能抓住那些拥有您正在寻找的权限的人。

2)要在没有T-SQL乐趣的情况下执行此操作,只需在Permissions类上创建一个递归函数,其上包含Module属性,该函数将遍历所有子项并仅返回那些拥有您正在寻找的权限的孩子(注意:这将需要比第一个更多的资源,并且在您的应用程序中会更慢,因为这将主要是LINQ to Objects查询而不是LINQ to Entities)。

这样的事情:

[NotMapped]

就教程而言,我强烈建议您查看Pluralsight。 EF上有很多视频,其中包括微软EF MVP的Julie Lerman。