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

如何从字符串创建C#表达式,基于子对象字段过滤数据?

解决方案

一、使用动态LINQ库(推荐)

直接借助System.Linq.Dynamic.Core NuGet包可以快速实现字符串表达式转LINQ查询,这是处理此类需求最便捷的方式:

  1. 先安装System.Linq.Dynamic.Core包
  2. 修正原表达式:你的原表达式documents.Age == 25存在逻辑问题——documents是集合类型,不能直接访问单个元素的Age属性,需用Any判断是否存在符合条件的子对象,正确表达式应为documents.Any(Age == 25)
  3. 代码示例:
using System.Linq.Dynamic.Core;

// 假设masterDocuments是你的IQueryable<MasterDocument>数据源
IQueryable<MasterDocument> masterDocuments = ...;
var filterQuery = "documents.Any(Age == 25)";
var filteredResult = masterDocuments.Where(filterQuery).ToList();

二、手动构建表达式树(无第三方依赖)

如果不能引入外部库,可以手动构建表达式树实现相同逻辑:

using System.Linq.Expressions;

// 1. 定义参数表达式(代表输入的MasterDocument对象)
ParameterExpression masterParam = Expression.Parameter(typeof(MasterDocument), "m");

// 2. 获取MasterDocument的documents属性
MemberExpression documentsProp = Expression.Property(masterParam, nameof(MasterDocument.documents));

// 3. 构建子对象的过滤条件:SubDocument.Age == 25
ParameterExpression subParam = Expression.Parameter(typeof(SubDocument), "s");
Expression ageProp = Expression.Property(subParam, nameof(SubDocument.Age));
ConstantExpression targetAge = Expression.Constant(25, typeof(int));
BinaryExpression ageEqualsExpr = Expression.Equal(ageProp, targetAge);
Expression<Func<SubDocument, bool>> subPredicate = Expression.Lambda<Func<SubDocument, bool>>(ageEqualsExpr, subParam);

// 4. 调用Enumerable.Any方法,传入documents集合和子条件
MethodInfo anyMethod = typeof(Enumerable).GetMethods()
    .Where(m => m.Name == "Any" && m.GetParameters().Length == 2)
    .First()
    .MakeGenericMethod(typeof(SubDocument));
Expression anyCallExpr = Expression.Call(anyMethod, documentsProp, subPredicate);

// 5. 构建最终的查询表达式
Expression<Func<MasterDocument, bool>> finalPredicate = Expression.Lambda<Func<MasterDocument, bool>>(anyCallExpr, masterParam);

// 6. 执行过滤
var filteredResult = masterDocuments.Where(finalPredicate).ToList();

关键说明

  • 核心逻辑:针对子集合的过滤必须通过Any(存在匹配)或All(全部匹配)等集合方法实现,不能直接访问集合的元素属性
  • 动态LINQ库支持绝大多数常见LINQ语法,包括子集合操作、逻辑/比较运算符,适合快速落地需求
  • 手动构建表达式树适合需要高度自定义或受限环境,但代码复杂度更高

内容的提问来源于stack exchange,提问作者alfred vikas paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:50:26