gpt4 book ai didi

C# 表达式 - 从另一个表达式创建一个表达式

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:01 26 4
gpt4 key购买 nike

我正在尝试使用看起来像这样的表达式创建一个可重用的方法:

Expression<Func<Order, bool>> CreateExpression(Expression<Func<Order, int>> parameter, FilterOperator operator, int value)

所以我可以这样使用它:

IQueryable<Order> orders = db.Orders;

var filtered = orders.Where(CreateExpression(o => o.OrderID, FilterOperator.GreaterThan, 100));

虽然我不确定如何编写该方法。我如何编写一个方法来为我创建这个表达式?

我需要能够做这样的事情:

if(operator == FilterOperator.GreaterThan)
return m => m.OrderID > value;
else if(operator == FilterOperator.LessThan)
return m => m.OrderID < value;

但我想使用传入的表达式而不是直接使用 OrderID。我该怎么做?

最佳答案

static Expression<Func<T, bool>> CreateExpression<T>(Expression<Func<T, int>> parameter, FilterOperator @operator, int value)
{
var argExpr = Expression.Parameter(typeof(T), "p");
var paramExpr = Expression.Invoke(parameter, argExpr);
var constExpr = Expression.Constant(value);
Expression compExpr = null;
switch(@operator)
{
case FilterOperator.GreaterThan:
compExpr = Expression.GreaterThan(paramExpr, constExpr);
break;
case FilterOperator.LessThan:
compExpr = Expression.LessThan(paramExpr, constExpr);
break;
}

return Expression.Lambda<Func<T, bool>>(compExpr, argExpr);
}

如果您不能使用 Invoke 并且您的 parameter 表达式是一个成员表达式,那么您可以使用您的新参数重新创建它:

static Expression<Func<T, bool>> CreateExpression<T>(Expression<Func<T, int>> parameter, FilterOperator @operator, int value)
{
var memberExpr = (MemberExpression)parameter.Body;
PropertyInfo property = (PropertyInfo)memberExpr.Member;

var argExpr = Expression.Parameter(typeof(T), "p");
var propertyExpr = Expression.Property(argExpr, property);
var constExpr = Expression.Constant(value);

Expression compExpr = null;
switch(@operator)
{
case FilterOperator.GreaterThan:
compExpr = Expression.GreaterThan(propertyExpr, constExpr);
break;
case FilterOperator.LessThan:
compExpr = Expression.LessThan(propertyExpr, constExpr);
break;
}

return Expression.Lambda<Func<T, bool>>(compExpr, argExpr);
}

关于C# 表达式 - 从另一个表达式创建一个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13570664/

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