我有以下型号。每个模块都有一个嵌套的类型为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。
答案 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。