EF Core 5中跨多层多对多关联查询主体是否持有指定权限的方法
解决方案
你最初使用Include/ThenInclude的写法是用来预加载关联实体到内存的,不适合直接做存在性校验。你可以直接嵌套使用Any方法,就能在单次数据库查询中完成校验,不需要加载任何实体到内存:
// 异步校验写法,直接返回布尔值标识是否持有对应权限 var hasPermission = await context.Principals .AnyAsync(p => p.Id == "SomeUUID" && p.Roles.Any(r => r.Permissions.Any(perm => perm.Name == "SomePermission") ) );
方案说明
- 该写法会被EF Core自动翻译为你补充的第二种嵌套
EXISTS结构的SQL,全程在数据库层面执行,不需要把Principal、Role、Permission的相关数据加载到内存做遍历。 - 嵌套
EXISTS查询的性能优于关联JOIN的实现,因为数据库只要匹配到第一条符合条件的记录就会终止查询,不会处理全量关联数据。
如果你显式声明了多对多的中间表实体,也可以从中间表出发编写查询,效果完全一致:
var hasPermission = await context.RolePermissions .AnyAsync(rp => rp.Permission.Name == "SomePermission" && rp.Role.Principals.Any(p => p.Id == "SomeUUID") );
内容的提问来源于stack exchange,提问作者Beltway
相关产品推荐
相关产品推荐

