gpt4 book ai didi

c# - LINQ 查询以检查表中所有列中的谓词

转载 作者:太空狗 更新时间:2023-10-29 23:36:30 25 4
gpt4 key购买 nike

我有一个包含 30 列的表格,它包含 1000 行。我想要一个 LINQ 查询,它检查所有列中的特定值并将结果转换为列表。

例如:

table.where(allcolumnvalue.contains(searchvalue)).Tolist()

如何使用一个 LINQ 查询完成上述任务。非常感谢任何帮助。

最佳答案

对于您的请求,所有字段都应该具有相同的类型,至少在静态类型的 C# 中。

方法Queriable.Where得到 Expression<Func<T, bool>>谓词作为参数。所以你需要构建谓词 o.p1 == val || o.p2 == val || o.p3 = val ...作为Expression值(value)。这里oExpression<Func<T, bool>>的一个参数:

public Expression BuildExpression<TObj, TVal>(TObj obj, TVal val)
{
Expression<Func<TObj, bool>> predicate = (o) => o.p1 == val || ... || o.pN == val;
return predicate;
}

但我们需要为 TObj 的所有属性动态构建谓词类型为 TVal .

为了简化代码,我们将构建相等表达式 false || o.p1 == val || ... || o.pN == val .

public Expression<Func<TObj, bool>> BuildExpression<TObj, TVal>(TVal val)
{
var parameter = Expression.Parameter(typeof(TObj), "o");
var valExpression = Expression.Constant(val, typeof(TVal));
var body = Expression.Constant(false, typeof(bool));

var properties = typeof(TObj).GetProperties()
.Where(p => p.PropertyType == typeof(TVal));
foreach (var property in properties)
{
var propertyExpression = Expression.Property(parameter, property);
var equalExpression = Expression.Equal(propertyExpression, valExpression);
body = Expression.Or(body, equalExpression);
}

return Expression.Lambda<Func<TObj, bool>>(body, parameter);
}

. . .

using (var dbContext = new DbContext())
{
var whereExpression = BuildExpression<User, string>("foo");
var contaningsFoo = dbContext.Users.Where(whereExpression);
}

关于c# - LINQ 查询以检查表中所有列中的谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44408583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com