c# - 使用选择器的表达式树条件转换

标签 c# expression-trees

我有一个像这样的实体类

public class BookPage {
    public int PageIndex { get; set; }
}

然后我有一个表达式:

Expression<Func<int, bool>> pageIndexCondition = idx => idx == 1;

以及我想要的表达方式:

Expression<Func<BookPage, bool>> pageCondition = bookPage => bookPage.PageIndex == 1;

问题:如何使用 pageIndexCondition 进行 LINQ-to-SQL 查询,或者如何将 pageIndexCondition 转换为 pageCondition

编辑:另一种不太优雅但仍能满足我要求的解决方案是:

Expression<Func<T, bool>> GetPageIndexCondition(Expression<Func<T, int>> selector) {
     return (T item) => selector(item) < 10; // This won't work because selector is Expression, so how to implement this correctly?
}

...

var pageCondition = GetPageIndexCondition(page => page.PageIndex);

最佳答案

我喜欢做这些事情,尽管正如其他人所说,可能有更有效和更好的方法来做这些事情:

void Main()
{
    Expression<Func<int, bool>> pageIndexCondition = idx => idx == 1;
    Expression<Func<BookPage, bool>> converted = ExpressionConverter.Convert(pageIndexCondition);
}

public class ExpressionConverter : ExpressionVisitor
{
    public static Expression<Func<BookPage, bool>> Convert(Expression<Func<int, bool>> e)
    {
        var oldParameter = e.Parameters.First();
        var newParameter = Expression.Parameter(typeof(BookPage), "bp");
        Expression<Func<BookPage, int>> x = (BookPage bp) => bp.PageIndex;
        var property = ((x.Body as MemberExpression).Member as PropertyInfo);
        var memberAccess = Expression.Property(newParameter, property);

        var converter = new ExpressionConverter(oldParameter, memberAccess);
        return (Expression<Func<BookPage, bool>>)Expression.Lambda(converter.Visit(e.Body), newParameter);
    }

    private ParameterExpression pe;
    private Expression replacement;

    public ExpressionConverter(ParameterExpression pe, Expression replacement)
    {
        this.pe = pe;
        this.replacement = replacement;
    }

    protected override Expression VisitParameter(ParameterExpression node)
    {
        if(node == pe)
            return replacement;

        return base.VisitParameter(node);
    }

}

关于c# - 使用选择器的表达式树条件转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483771/

相关文章:

c# - 使用异步绑定(bind)时如何避免闪烁

带有进度跟踪的 C# HttpWebRequest 表单发布(用于上传可能较大的文件)

c# - 具有另一个结构的固定大小数组的结构

c# - 将表达式树作为参数传递给另一个表达式树

c# - 如何编译带有参数操作的 MethodCallExpression?

c# - 需要一种方法来获取构建给定表达式树的代码

c# - 使用另一个线程停止一个线程的工作

c# - .Net 3.5 中的 Expression.Assign 是否等效?

linq - 尝试使用表达式树过滤 Nullable 类型

c# - Entity Framework - 多个数据库连接