使用PredicateBuilder可以使用一种方法来构建字段名称的可变长度列表中的谓词吗? [英] Using PredicateBuilder is there a way to build a predicate off of a variable length list of field names?

查看:207
本文介绍了使用PredicateBuilder可以使用一种方法来构建字段名称的可变长度列表中的谓词吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我不知道该怎么做。任何建议?



TIA

解决方案

你只能写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(fieldName中的var fieldName)
{
var expr = GenerateFieldNotNullExpression< MyType>(fieldName);
predicate = predicate.And(expr);
}


I have a list containing a variable number of field names. I would like to do a loop through this list and create a predicate that filters for all records that have a value in the field.

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

I'm not sure how to go about doing this. Any suggestions?

TIA

解决方案

You can only write lambda expressions if you know what the properties are at compile time. Since you clearly don't know what the fields are that you want to examine, you'll have to create the expressions by hand.

You'll need a helper function like this to generate the expression:

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;
}

Then use this to create your expressions and plug them in:

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

这篇关于使用PredicateBuilder可以使用一种方法来构建字段名称的可变长度列表中的谓词吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆