使用PredicateBuilder有一种方法可以从可变长度的字段名称列表构建谓词吗?

时间:2013-02-01 23:06:56

标签: linq entity-framework predicatebuilder

我有一个包含可变数量的字段名称的列表。我想循环遍历此列表并创建一个谓词,用于过滤所有在该字段中具有值的记录。

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

我不知道该怎么做。有什么建议吗?

TIA

1 个答案:

答案 0 :(得分:7)

如果您知道编译时属性是什么,则只能编写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);
}