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。

ASP.NET EF6 查询模型

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)的一些视频。