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

如何用动态生成的多值过滤集合中的指定列?

解决动态多值过滤集合的问题

嘿,我来帮你搞定这个动态过滤的问题!你之前的代码之所以没达到预期效果,核心问题在于:你把字符串形式的条件直接传给了Where方法,但Where需要的是一个Func<TSource, bool>(内存集合场景)或者Expression<Func<TSource, bool>>(EF等ORM查询场景),不是普通字符串,所以这段代码根本不会按照你想要的逻辑执行过滤。

下面给你两种常见场景的解决方案,完全适配动态生成的过滤值:

场景1:内存中的集合(比如List、Array)

如果你的collection已经加载到内存里,这是最简单的情况——先把动态生成的过滤值放到一个集合里,然后用Any来判断目标列是否包含其中任意一个值:

// 假设这是你动态生成的过滤值列表,数量随便加
var filterValues = new List<string> { "Test", "Test2" };

// 核心过滤逻辑:只要was.Name包含filterValues里的任意一个值就保留
var filteredResult = collection.Where(was => filterValues.Any(val => was.Name.Contains(val))).ToList();

不管filterValues里有1个还是100个值,这段代码都能自动适配,完美解决动态值的问题。

场景2:EF等ORM的查询集合(比如DbSet)

如果你的collection是EF的DbSet或者其他IQueryable<T>类型(需要转换成SQL查询的),直接用上面的Any可能会让EF无法正确解析表达式,这时候我们需要手动构建表达式树:

using System.Linq.Expressions;

// 动态生成的过滤值
var filterValues = new List<string> { "Test", "Test2" };

// 先构建lambda表达式的参数(也就是你代码里的was)
var parameter = Expression.Parameter(typeof(YourEntityType), "was");
// 获取Name属性的表达式
var nameProperty = Expression.Property(parameter, "Name");

Expression<Func<YourEntityType, bool>> combinedCondition = null;

foreach (var value in filterValues)
{
    // 构建was.Name.Contains(value)这个表达式
    var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
    var valueConstant = Expression.Constant(value);
    var containsExpression = Expression.Call(nameProperty, containsMethod, valueConstant);

    // 把多个Contains条件用||连接起来
    if (combinedCondition == null)
    {
        combinedCondition = Expression.Lambda<Func<YourEntityType, bool>>(containsExpression, parameter);
    }
    else
    {
        combinedCondition = Expression.Lambda<Func<YourEntityType, bool>>(
            Expression.OrElse(combinedCondition.Body, containsExpression),
            parameter);
    }
}

// 执行过滤
var filteredResult = collection.Where(combinedCondition).ToList();

记得把YourEntityType替换成你集合中元素的实际类型,这段代码会动态构建出和你之前字符串里一模一样的||连接的Contains条件,而且EF能正确把它转换成对应的SQL查询语句。

再补一句:为什么原代码不行?

你原代码里的input是个字符串,而Where需要的是一个可执行的委托或者表达式树,C#编译器不会把字符串自动转换成可运行的代码逻辑,所以你的过滤条件相当于完全没生效,甚至如果是IQueryable场景的话,代码根本编译不过。

内容的提问来源于stack exchange,提问作者lio programista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:39