Используя PredicateBuilder, есть ли способ построить предикат из списка имен полей переменной длины?

У меня есть список, содержащий переменное количество имен полей. Я хотел бы сделать цикл по этому списку и создать предикат, который фильтрует все записи, которые имеют значение в поле.

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

Я не уверен, как это сделать. Какие-либо предложения?

ТИА


person John S    schedule 01.02.2013    source источник


Ответы (1)


Вы можете писать лямбда-выражения только в том случае, если знаете, каковы свойства во время компиляции. Поскольку вы явно не знаете, какие поля хотите исследовать, вам придется создавать выражения вручную.

Вам понадобится вспомогательная функция, подобная этой, чтобы сгенерировать выражение:

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);
}
person Jeff Mercado    schedule 01.02.2013