使用PredicateBuilder有没有建立一个谓语过场名称的长度可变列表的方式吗?(Using

2019-08-16 17:02发布

我有一个包含可变数量的字段名称的列表。 我想通过这个列表做一个循环,并开发出能为那些在该领域的值的所有记录筛选谓词。

foreach (var field in FieldNames)
            {
            myPredicate= myPredicate.And(m => m.*field*!=null );                    
}   

我不知道如何去这样做。 有什么建议?

TIA

Answer 1:

如果您知道属性是在编译时你只能写lambda表达式。 既然你显然不知道什么字段是要检查,你必须手动创建表达式。

你需要这样的辅助函数生成的表达式:

public Expression<Func<T, bool>> GenerateFieldNotNullExpression<T>(string fieldName)
{
    var parameter = Expression.Parameter(typeof(T), "m");
    // m
    var fieldAccess = Expression.PropertyOrField(parameter, fieldName);
    // m.[fieldName]
    var nullValue = Expression.Constant(null);
    // null
    var body = Expression.NotEqual(fieldAccess, nullValue);
    // m.[fieldName] != null
    var expr = Expression.Lambda<Func<T, bool>>(body, parameter);
    // m => m.[fieldName] != null
    return expr;
}

然后用它来创建你的表情和将它们插入:

var predicate = PredicateBuilder.True<MyType>();
foreach (var fieldName in fieldNames)
{
    var expr = GenerateFieldNotNullExpression<MyType>(fieldName);
    predicate = predicate.And(expr);
}


文章来源: Using PredicateBuilder is there a way to build a predicate off of a variable length list of field names?