gpt4 book ai didi

c# - ASP.NET EF6 查询模型

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:06 24 4
gpt4 key购买 nike

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

[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"));

顺便说一句,我不知道如何正确使用这些函数,例如 include、where、any、select many 函数。对此的任何教程或书籍表示赞赏。我找不到关于此的任何好的教程,因为我不知道要搜索什么关键字。这是 EF 还是 LINQ。

最佳答案

Include 方法告诉 Entity Framework 在进入数据库以取回记录时填充特定的导航属性(即它急切加载数据而不是使用延迟加载,这需要EF 稍后返回数据库)。它不进行任何类型的过滤。所有这些都是通过“Where”方法完成的。

要对所有 child 执行您要求的那种过滤,您必须执行以下两项操作之一:

1) 在 SQL 中创建一个公用表表达式,它将递归地获取特定模块的所有子项,将该 CTE 放置在 SQL View 中,将 EF 实体映射到该 View ,然后查询该 View ,包括 JoinPermissions 表以仅获取那些拥有您正在寻找的权限的人。

2) 要在没有 T-SQL 乐趣的情况下执行此操作,只需在 Module 类上创建一个递归函数,并在其上添加 [NotMapped] 属性,它将通过所有的 child 并只返回那些拥有您正在寻找的权限的 child (注意:这将需要比第一个更多的资源,并且在您的应用程序中会更慢,因为这将主要是 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。 EF 上有许多视频,包括 Microsoft 的 EF MVP Julie Lerman 的一些视频。

关于c# - ASP.NET EF6 查询模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com