Dynamic Linq/EF Where查询在子集合过滤时失效问题
解决EF+Dynamic Linq过滤子集合时的类型不匹配问题
场景还原
开发基于GraphQL、HotChocolate和Entity Framework的API,需实现用户权限控制。权限实体定义如下:
public class Permissions { public int InformationId { get; set; } public bool View { get; set; } public bool ViewSecret{ get; set; } }
最初通过关联权限表过滤数据,性能不佳,改为先查询用户权限列表,再用权限结果过滤主查询和子集合。
问题现象
主查询使用Dynamic Linq构建字符串过滤条件,运行正常:
var workingQueryFilter = Filter(ListOfPermissions); public static string Filter(List<Permissions> permission) { var expression = "i => i.IsDeleted == false"; for (var i = 0; i < permission.Count; i++) { expression += $"i.InformationId == {permission[i].InformationId} && {permission[i].View}"; } return expression; }
但在过滤ChildInformation子集合时抛出错误:
类型为'System.Collections.Generic.List
1[Models.ChildInformation]'的表达式无法用于方法'System.Linq.IQueryable1[Models.ChildInformation] Where[ChildInformation](System.Linq.IQueryable`1[Models.ChildInformation], System.String, System.Object[])'的参数'arg0'
对应的查询代码:
var result = _dbContext.Information .Where(workingQueryFilter) .Select(x => new Information { Name = x.Name, ChildInformation = x.ChildInformation .AsQueryable() .Where(notWorkingQueryFilter).ToList() });
解决方案
放弃Dynamic Linq的字符串过滤方式,改用PredicateBuilder构建强类型的表达式树,问题得以解决。
内容的提问来源于stack exchange,提问作者fouks
相关产品推荐
相关产品推荐

