【问题标题】:Generating an Expression<Func<TEntity, bool>> for multi-level expression为多级表达式生成 Expression<Func<TEntity, bool>>
【发布时间】:2016-02-26 16:30:25
【问题描述】:

如果其他答案中涵盖了这一点,我们深表歉意。我整夜搜索并浏览了一百个其他解决方案,但无法将拼图拼凑在一起。我已经尝试过 LinqPad、PredicateBuilder、ExpressionVisitor 等,但我仍然摸不着头脑。

我正在尝试实现比这稍微复杂一些的东西,但这段代码显示了问题:

public Expression<Func<TEntity, bool>> GeneratorEqualityTest<TProperty>(Expression<Func<TEntity, TProperty>> accessor, int expectedValue) {
    // Help
    var argument = Expression.Parameter(typeof(TEntity));
    var accessorArgument = Expression.Property(argument, accessor.ToPropertyName());
    // Help

    Predicate = Expression.Lambda<Func<TEntity, bool>>(Expression.Equal(accessorArgument, Expression.Constant(expectedValue)), argument);
}

当访问器是这样的时候,这很好用:x =&gt; x.Value

但不适用于x =&gt; x.Complex.Valuex =&gt; x.Complex.MoreComplex.Value

我正在尝试从 >=5 或 (5...10] 等字符串中解析表达式并生成可以插入到 LINQ-to-EF 查询的 Where 子句中的表达式(并转换为 T -SQL)。这对于单级情况很好,但我不知道如何遍历表达式。

在 EF 中,x.Complex.MoreComplex.Value 对应 SQL Join 的。如果可以将访问器转换为我可以传递给Include() 语句的东西,则可以加分

我在 Github 上放了一个示例项目:https://github.com/scottt732/ExpressionHelp

【问题讨论】:

  • 不应该是TProperty expectedValue而不是int吗?

标签: c# entity-framework linq expression-trees


【解决方案1】:

由于您正在接收最终值访问器,因此您只需要它来应用比较功能(即构建谓词的 body):

public Expression<Func<TEntity, bool>> GeneratorEqualityTest<TProperty>(Expression<Func<TEntity, TProperty>> accessor, TProperty expectedValue)
{
    var body = Expression.Equal(accessor.Body, Expression.Constant(expectedValue));
    var predicate = Expression.Lambda<Func<TEntity, bool>>(body, accessor.Parameters);
    return predicate; 
}

奖励方式:

static class ExpressionUtils
{
    public static IEnumerable<Expression<Func<TEntity, object>>> Includes<TEntity, TProperty>(this Expression<Func<TEntity, TProperty>> accessor)
    {
        var root = accessor.Parameters[0];
        for (var node = accessor.Body as MemberExpression; node != null && node.Expression != root; node = node.Expression as MemberExpression)
            yield return Expression.Lambda<Func<TEntity, object>>(node.Expression, root);
    }
}

【讨论】:

  • 谢谢!这正是我所需要的。
  • 知道如何将 Expression> x =&gt; x.Complex.MoreComplex.Value 转换为 Expression>[] x =&gt; x.Complex.MoreComplex 吗?后一个表达式可用作 Include 语句来优化我正在生成的查询。
  • 当然。将其添加到答案中。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多