抱歉,如果其他答案中都包含此内容。我一整夜都在搜索,并尝试了一百种其他解决方案,但不能完全解决这些难题。我已经试验过LinqPad,PredicateBuilder,ExpressionVisitors等,但是我仍然抓挠我的头。

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

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 => x.Value

但不适用于x => x.Complex.Valuex => 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

最佳答案

由于您收到的是最终值访问器,因此您需要使用它来应用比较功能(即构建谓词的主体):

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);
    }
}

关于c# - 生成用于多级表达式的Expression <Func <TEntity,bool >>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35633495/

10-17 02:48