C# 集合属性的EF Core 5.0.x QueryFilter(带ValueConversion)
我有一个带有字符串集合属性的C# 集合属性的EF Core 5.0.x QueryFilter(带ValueConversion),c#,linq,entity-framework-core,.net-5,global-query-filter,C#,Linq,Entity Framework Core,.net 5,Global Query Filter,我有一个带有字符串集合属性的Url实体,该属性包含角色名称: public class Url : BaseEntity { public ICollection<string> Roles { get; private set; } = new HashSet<string>(); } 我需要的是Url实体的全局查询过滤器,如下所示: builder.Entity<Url>() .HasQu
Url
实体,该属性包含角色名称:
public class Url : BaseEntity
{
public ICollection<string> Roles { get; private set; } = new HashSet<string>();
}
我需要的是Url实体的全局查询过滤器,如下所示:
builder.Entity<Url>()
.HasQueryFilter(url => !url.Deleted && (url.Roles.Count == 0 || url.Roles.Intersect(_tokenAccessor.UserRoles).Any()));
LINQ表达式'DbSet()
。其中(u=>!(u.Deleted)和&u.Roles.Count==0)无法翻译。或者以可以翻译的形式重写查询,
或者通过插入对的调用显式切换到客户端评估
“AsEnumerable”、“AsAsAsAsAsyncEnumerable”、“ToList”或“ToListSync”
是否有方法访问全局查询筛选器中的
角色
属性?我有个坏消息要告诉你。这是行不通的。如果EF无法为查询筛选器创建SQL,则所有操作都将失败。如何为拆分的哈希集创建SQL?也许有一个选项可以将字符串字段额外映射到字符串属性,并在查询筛选器中使用此属性?这是很有可能的,但需要一些SQL魔法。首先,在简单的Where
query中训练这个过滤器,如果它能工作,你可以将它移动到queryfilter。在我看来,你应该重新设计你的权限系统,因为没有DB索引支持的查询将来会带来更多的麻烦。谢谢。我现在更改了数据库设计。这些角色现在由n:m导航引用,通过这种方法,我能够使查询过滤器工作。
builder.Entity<Url>()
.HasQueryFilter(url => !url.Deleted && (url.Roles.Count == 0 || url.Roles.Intersect(_tokenAccessor.UserRoles).Any()));
builder.Entity<Url>()
.HasQueryFilter(url => !url.Deleted && (url.Roles.Count == 0));