gpt4 book ai didi

c# - 将 Linq 表达式添加到表达式列表的方法

转载 作者:行者123 更新时间:2023-12-02 04:46:01 30 4
gpt4 key购买 nike

我有一个 Linq 表达式列表,例如:

List<Expression<Func<Customer, bool>>>

我需要从搜索页面添加一大堆谓词,例如:

x.Name.Contains(searchString)
x.Description.Contains(searchString)
...

我想创建一个方法,这样我就不会得到大量重复的代码。带有签名的东西,例如:

void AddCustomerPredicate(List<Expression<Func<Customer, bool>>> predicates, Expression<Func<Customer, string>> prop, string searchString);

我会这样使用:

var predicates = new List<Expression<Func<Customer, bool>>>();
AddCustomerPredicate(predicates, x => x.Name, this.Name);
AddCustomerPredicate(predicates, x => x.Description, this.Description);
...

我稍微简化了问题,但这就是问题的要点。表达式树之类的我没做过多少工作,所以我不确定如何实现这个方法?

**编辑**

我可能把问题过度简化了。我知道如何添加到列表中,例如 predicates.Add(x => x.Name.Contains(this.searchString)) ,但在将每个搜索参数添加到列表之前,我想对每个搜索参数执行各种操作(例如,检查是否为 null 或空)。因此,我想像上面那样对每个搜索参数调用一个方法,这样所有这些东西都可以包含在一个方法中。

最佳答案

你真正需要的是有一个翻译的方法Expression<Func<T, string>>Expression<Func<T, bool>> :

public static Expression<Func<T, bool>> GetContainsExpression<T>(Expression<Func<T, string>> prop, string searchString)
{
var method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant(searchString, typeof(string));
var containsMethodExp = Expression.Call(prop.Body, method, someValue);

return Expression.Lambda<Func<T, bool>>(containsMethodExp, prop.Parameters[0]);
}

这是受另一个答案的启发:How do I create an expression tree to represent 'String.Contains(“term”)' in C#?

var predicates = new List<Expression<Func<Customer, bool>>>();
predicates.Add(GetContainsExpression((Customer x) => x.Name, this.Name));
predicates.Add(GetContainsExpression((Customer x) => x.Description, this.Description));

关于c# - 将 Linq 表达式添加到表达式列表的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792485/

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