ASP.NET EF6 查询模型
本文关键字:模型 查询 EF6 NET ASP | 更新日期: 2023-09-27 18:35:54
我有以下模型。每个模块都有一个 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 函数,它将正确返回所有根及其子根。
public override IQueryable<Module> All()
{
return this.Context.Set<Module>().Include(c => c.Children).Where(p => p.ParentModuleId == null);
}
现在,我想返回具有权限"用户"的子级的相同根列表。我该怎么做。这就是我到目前为止所拥有的。这是正确的做法吗?请帮忙。
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"));
顺便说一句,我不知道如何正确使用这些功能,例如包括,在哪里,任何,选择许多功能。任何教程或书籍都值得赞赏。我找不到任何关于此的好教程,因为我不知道要搜索什么关键字。这是 EF 还是 LINQ。
Include
方法告诉实体框架在转到数据库以返回记录时填充该特定导航属性(即,它急切加载数据而不是利用延迟加载,这将需要 EF 稍后返回到数据库)。它不进行任何类型的过滤。所有这些都是通过"位置"方法完成的。
要对所有孩子进行您要求的那种过滤,您必须执行以下两件事之一:
1) 在 SQL 中创建一个公用表表达式,该表达式将以递归方式获取特定模块的所有子模块,将该 CTE 放置在 SQL 视图中,将 EF 实体映射到该视图,然后查询该视图,包括对Permissions
表的Join
,以仅获取具有所需权限的表。
2)要在没有T-SQL乐趣的情况下做到这一点,只需在Module
类上创建一个递归函数,上面有[NotMapped]
属性,该函数将遍历所有子项,并仅返回具有您要查找的权限的子项(注意:这将需要比第一个更多的资源,并且在您的应用程序中会更慢, 因为这主要是 LINQ to Objects 查询,而不是 LINQ to Entities)。
像这样:
[NotMapped]
public List<Module> GrabModulesWithPermission(string permission)
{
var toReturn = new List<Module>();
if (this.Children != null && this.Children.Any(c => c.Permissions.Any(r => r.Role == permission))
{
toReturn.AddRange(this.Children.Where(c => c.Permissions.Any(r => r.Role == permission).SelectMany(c => c.GrabModulesWithPermission(permission)));
}
toReturn.Add(this);
return toReturn;
}
就教程而言,我强烈建议您查看Pluralsight。英孚上有许多视频,包括Microsoft的英超MVP朱莉·勒曼(Julie Lerman)的一些视频。