You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.List1[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:41:13