可変数のフィールド名を含むリストがあります。このリストをループして、フィールドに値を持つすべてのレコードをフィルター処理する述語を作成したいと思います。
foreach (var field in FieldNames)
{
myPredicate= myPredicate.And(m => m.*field*!=null );
}
これを行う方法がわかりません。助言がありますか?
ティア
可変数のフィールド名を含むリストがあります。このリストをループして、フィールドに値を持つすべてのレコードをフィルター処理する述語を作成したいと思います。
foreach (var field in FieldNames)
{
myPredicate= myPredicate.And(m => m.*field*!=null );
}
これを行う方法がわかりません。助言がありますか?
ティア
コンパイル時にプロパティが何であるかを知っている場合にのみ、ラムダ式を記述できます。調べたいフィールドが何であるかが明らかにわからないため、手動で式を作成する必要があります。
式を生成するには、次のようなヘルパー関数が必要です。
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);
}