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

kar*_*lan 5 c# sql linq

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

例如:

table.where(allcolumnvalue.contains(searchvalue)).Tolist()
Run Code Online (Sandbox Code Playgroud)

如何使用一个LINQ查询完成上述操作.任何帮助深表感谢.

Mar*_*nko 2

对于您的请求,所有字段都应具有相同的类型,至少在静态类型 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)