4

可変数のフィールド名を含むリストがあります。このリストをループして、フィールドに値を持つすべてのレコードをフィルター処理する述語を作成したいと思います。

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

これを行う方法がわかりません。助言がありますか?

ティア

4

1 に答える 1

7

コンパイル時にプロパティが何であるかを知っている場合にのみ、ラムダ式を記述できます。調べたいフィールドが何であるかが明らかにわからないため、手動で式を作成する必要があります。

式を生成するには、次のようなヘルパー関数が必要です。

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);
}
于 2013-02-01T23:50:49.863 に答える