gpt4 book ai didi

c# - String.Contains 和 string[] 的表达式生成器函数

转载 作者:行者123 更新时间:2023-11-30 16:59:32 24 4
gpt4 key购买 nike

我很难创建一个表达式构建器函数来传递给 NHibernate 存储库的查询。

基本上我想要做的是从各种对象属性(字符串)构建一个查询,并将它们的值与数组中的值进行比较。也可以添加其他查询语句。

有点像

public static Expression<Func<TElement, bool>> BuildOrExpression<TElement, TValue>
(Dictionary<Expression<Func<TElement, TValue>>, IEnumerable<TValue>> expressionSet)
{
List<Expression> newExpressions = new List<Expression>();

foreach (var item in expressionSet)
{
if (null == item.Key) throw new ArgumentNullException("valueSelector");
if (null == item.Value) throw new ArgumentNullException("values");

ParameterExpression p = item.Key.Parameters.Single();

if (!item.Value.Any()) return e => false;

IEnumerable<Expression> expressions = item.Value
.Select(value => (Expression)Expression.Equal(item.Key.Body, Expression.Constant(value, typeof(TValue))));
Expression compExpression = expressions
.Aggregate<Expression>((accumulate, equal) => Expression.OrElse(accumulate, equal));
newExpressions.Add(Expression.Lambda<Func<TElement, bool>>(compExpression, p));
}

Expression accExpression = newExpressions
.Aggregate<Expression>((accumulate, equal) => Expression.OrElse(accumulate, equal));

return Expression.Lambda<Func<TElement, bool>>(accExpression);
}

但不是以某种方式执行 Expression.Equal 而是执行 String.Contains

欢迎任何帮助。顺便说一句,上面的代码没有经过测试。

最佳答案

您需要使用 Expression.Call 并传递 Contains MethodInfo 实例,而不是 Expression.Equal。像这样

IEnumerable<Expression> expressions = item.Value.Select(value => 
(Expression)Expression.Call(item.Key.Body,
typeof(String).GetMethod("Contains"),
Expression.Constant(value, typeof(TValue))));

关于c# - String.Contains 和 string[] 的表达式生成器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676502/

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