抱歉,如果其他答案中都包含此内容。我一整夜都在搜索,并尝试了一百种其他解决方案,但不能完全解决这些难题。我已经试验过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.Value
或x => 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/