我有一个包含30列的表,它包含1000行.我想要一个LINQ查询,它检查所有列中的特定值并将结果转换为列表.
例如:
table.where(allcolumnvalue.contains(searchvalue)).Tolist()
Run Code Online (Sandbox Code Playgroud)
如何使用一个LINQ查询完成上述操作.任何帮助深表感谢.
对于您的请求,所有字段都应具有相同的类型,至少在静态类型 C# 中是这样。
该方法Queriable.Where获取Expression<Func<T, bool>>谓词作为参数。因此,您需要将谓词构建o.p1 == val || o.p2 == val || o.p3 = val ...为Expression值。这o是一个参数Expression<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;
}
Run Code Online (Sandbox Code Playgroud)
TObj但我们需要为具有 type的所有属性动态构建谓词TVal。
为了简化代码,我们将构建 equal 表达式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);
}
Run Code Online (Sandbox Code Playgroud)