gpt4 book ai didi

linq - 使用 PredicateBuilder 有没有办法根据可变长度的字段名称列表构建谓词?

转载 作者:行者123 更新时间:2023-12-03 07:25:23 24 4
gpt4 key购买 nike

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

foreach (var field in FieldNames)
{
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 (var fieldName in fieldNames)
{
var expr = GenerateFieldNotNullExpression<MyType>(fieldName);
predicate = predicate.And(expr);
}

关于linq - 使用 PredicateBuilder 有没有办法根据可变长度的字段名称列表构建谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com