首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ReplacingExpressionVisitor替换自定义ExpressionVisitor

用ReplacingExpressionVisitor替换自定义ExpressionVisitor
EN

Stack Overflow用户
提问于 2021-08-04 03:07:52
回答 1查看 64关注 0票数 0

我让下面的代码正常工作。

但是,我不想像现在这样使用定制的ParameterReplacer类,我更希望我可以去掉这个类,而使用ReplacingExpressionVisitor。但是我似乎找不到正确的语法,在那里我可以获得现有的参数,以便可以用parameter替换它。

GetDateExpression

代码语言:javascript
复制
protected readonly Expression<Func<T, DateTime>> GetDateExpression;

ParameterReplacer

代码语言:javascript
复制
internal class ParameterReplacer : ExpressionVisitor
{
    private readonly ParameterExpression Parameter;

    internal ParameterReplacer(ParameterExpression parameter)
    {
        Parameter = parameter;
    }

    protected override Expression VisitParameter(ParameterExpression node)
    {
        return base.VisitParameter(Parameter);
    }
}

主代码

代码语言:javascript
复制
Expression expression;
Expression startExpression, endExpression;

// Build sub expressions
var parameter = Expression.Parameter(typeof(T));
startExpression = startDate.HasValue ?
    Expression.GreaterThanOrEqual(GetNullableDateExpression.Body, Expression.Constant(startDate, typeof(DateTime?))) :
    null;
endExpression = endDate.HasValue ?
    Expression.LessThanOrEqual(GetNullableDateExpression.Body, Expression.Constant(endDate, typeof(DateTime?))) :
    null;

// Build main expression
if (startExpression != null && endExpression != null)
    expression = Expression.AndAlso(startExpression, endExpression);
else if (startExpression != null)
    expression = startExpression;
else
    expression = endExpression;

// TODO: Change to use ReplacingExpressionVisitor instead

// Use our real parameter
expression = new ParameterReplacer(parameter)
    .Visit(expression);

// Modify query
return query.Where(Expression.Lambda<Func<T, bool>>(expression, parameter));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-04 05:58:43

实际上最好在合并前替换参数:

代码语言:javascript
复制
Expression expression;
Expression startExpression, endExpression;

// Build sub expressions
var parameter = Expression.Parameter(typeof(T));

var nullableExpressionBody = ReplacingExpressionVisitor.Replace(GetNullableDateExpression.Body, GetNullableDateExpression.Parameters[0], parameter);

startExpression = startDate.HasValue ?
    Expression.GreaterThanOrEqual(nullableExpressionBody, Expression.Constant(startDate, typeof(DateTime?))) :
    null;
endExpression = endDate.HasValue ?
    Expression.LessThanOrEqual(nullableExpressionBody, Expression.Constant(endDate, typeof(DateTime?))) :
    null;

// Build main expression
if (startExpression != null && endExpression != null)
    expression = Expression.AndAlso(startExpression, endExpression);
else if (startExpression != null)
    expression = startExpression;
else
    expression = endExpression;

// Modify query
return query.Where(Expression.Lambda<Func<T, bool>>(expression, parameter));

此外,如果您重用来自GetNullableDateExpression的参数,则不需要替换。

代码语言:javascript
复制
// Build sub expressions
var parameter = GetNullableDateExpression.Parameters[0];

startExpression = startDate.HasValue ?
    Expression.GreaterThanOrEqual(GetNullableDateExpression.Body, Expression.Constant(startDate, typeof(DateTime?))) :
    null;
endExpression = endDate.HasValue ?
    Expression.LessThanOrEqual(GetNullableDateExpression.Body, Expression.Constant(endDate, typeof(DateTime?))) :
    null;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68644895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档