如何在C#中将LambdaExpression转换为Expression <Func <T,bool >>

手指10

我有以下代码,这些代码将LambdaExpression根据我的SearchTerm输入在运行时生成我正在尝试建立一个动态where子句。但是我坚持如何从转换LambdaExpressionExpression<Func<T,bool>>

private static Expression<Func<T,bool>> GetSearchAppliedQuery(IEnumerable<SearchTerm> terms)
{
    var parameterExpression = ExpressionHelper.Parameter<T>();
    Expression finalExpression = Expression.Constant(true);
    Expression subExpression = Expression.Constant(false);

    // Build up the LINQ Expression backwards:
    // query = query.Where(x => x.Property == "Value" && (x.AnotherProperty == "Value" || x.SomeAnotherProperty == "Value"));

    foreach (var term in terms)
    {
        var hasMultipleTerms = term.EntityName?.Contains(',') ?? false;

        if (hasMultipleTerms)
        {
            var entityTerms = term.EntityName.Split(',');

            foreach (var entityTerm in entityTerms)
            {
                term.EntityName = entityTerm;

                // x => x.Property == "Value" || x.AnotherProperty == "Value"
                subExpression = Expression.OrElse(subExpression, GetComparisonExpression(term, parameterExpression));
            }
        }

        // x => x.Property == "Value" && x.AnotherProperty == "Value"
        finalExpression = Expression.AndAlso(finalExpression, hasMultipleTerms ? subExpression : GetComparisonExpression(term, parameterExpression));
    }

    // x => x.Property == "Value" && (x.AnotherProperty == "Value" || x.SomeAnotherProperty == "Value")
    var lambdaExpression = ExpressionHelper.GetLambda<T, bool>(parameterExpression, finalExpression);

    // How to do this conversion??
    Expression<Func<T,bool>> returnValue = ..??;

    return returnValue;
}

我正在尝试应用上述方法的结果来获取查询,如下所示:

public static IQueryable<T> GetQuery(IQueryable<T> inputQuery, ISpecification<T> specification)
{
    var query = inputQuery;

    // modify the IQueryable using the specification's criteria expression
    if (specification.Criteria != null)
    {
        query = query.Where(specification.Criteria);
    }

    ...
    return query;
}

这样我的最终查询看起来像

query = query.Where(x => x.Property == "Value" && (x.AnotherProperty == "Value" || x.SomeAnotherProperty == "Value"))

编辑1:ExpressionHelper.GetLambda按@Ivan Stoev的要求添加方法

public static class ExpressionHelper
{
    public static LambdaExpression GetLambda<TSource, TDest>(ParameterExpression obj, Expression arg)
    {
        return GetLambda(typeof(TSource), typeof(TDest), obj, arg);
    }

    public static LambdaExpression GetLambda(Type source, Type dest, ParameterExpression obj, Expression arg)
    {
        var lambdaBuilder = GetLambdaFuncBuilder(source, dest);
        return (LambdaExpression)lambdaBuilder.Invoke(null, new object[] { arg, new[] { obj } });
    }

    private static MethodInfo GetLambdaFuncBuilder(Type source, Type dest)
    {
        var predicateType = typeof(Func<,>).MakeGenericType(source, dest);
        return LambdaMethod.MakeGenericMethod(predicateType);
    }
}

我是否缺少某些基本知识或做错了什么?请协助。

伊万·斯托夫

ExpressionHelper.GetLambda<T, bool>用于获取lambda表达式方法将隐藏其实际类型,这是所需的Expression<Func<T, bool>>,因此您所需要的只是使用强制转换运算符:

return (Expression<Func<T, bool>>)lambdaExpression;

或者更好的方法是,将结果类型更改ExpressionHelper.GetLambda<TSource, TDest>Expression<Func<TSource, TDest>>,或者不使用该辅助方法-当您在编译时知道泛型类型参数时,如果泛型Expression.Lambda方法(ExpressionHelper.GetLambda<TSource, TDest>似乎等同于Expression.Lambda<Func<TSource, TDest>>),则只需使用一个,例如

var lambdaExpression = Expression.Lambda<Func<T, bool>>(parameterExpression, finalExpression);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

来自分类Dev

如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

来自分类Dev

如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

来自分类Dev

是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

来自分类Dev

C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

来自分类Dev

将表达式转换为Expression <Func <T,bool >>

来自分类Dev

将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

来自分类Dev

正文Expression <Func <T,bool >>的复杂编辑

来自分类Dev

将谓词<T>转换为Func <T,bool>

来自分类Dev

如何将IQueryable <T>转换为Expression <Func <T,bool >>?

来自分类Dev

在IGrouping中使用Where(Expression <Func <T,bool >>)

来自分类Dev

从Expression <Func <T,bool >>实体框架返回所有实体

来自分类Dev

实体框架过滤器“ Expression <Func <T,bool >>”

来自分类Dev

将Func <T,TProperty>转换为Expression <Func <T,Property >>

来自分类Dev

如何从 Expression<Func<TSource, TSourceMember>> 转换为 Func<TSource, bool> 条件

来自分类Dev

如何将简单的视图模型转换为Func <T,bool>谓词?

来自分类Dev

Delete(Expression <Func <T,bool >>条件)MongoDB查询C#驱动程序

来自分类Dev

Func <T,bool>的逻辑逆

来自分类Dev

将Expression <Func <TModel,TValue >>转换为Expression <Func <TModel,bool >>

来自分类Dev

将Expression <Func <TEntity,IEnumerable <TProperty >>> valueSelector,TValue []值转换为Expression <Func <TElement,bool >>

来自分类Dev

C#如何解决Func <T,bool>中的矛盾性?

来自分类Dev

如何修改Expression <Func <???,bool >>的类型参数?

来自分类Dev

将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

来自分类Dev

C#将字符串解析为Func <T,bool>

来自分类Dev

将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

来自分类Dev

无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

来自分类Dev

具有约束条件的Moq表达式... It.Is <Expression <Func <T,bool >>>

来自分类Dev

将Expression <Func <T,bool >>传递到存储库的单元测试查询

来自分类Dev

为什么这个带有Expression <Func <T,bool>的模拟不匹配?

Related 相关文章

  1. 1

    方法重载中的 Expression<Func<T,bool>> 与 Func<T,bool>

  2. 2

    如何将 BinaryExpression 转换为 Expression<Func<T, bool>>?

  3. 3

    如何将Expression <Func <T,object >>转换为Expression <Func <T,bool >>?

  4. 4

    是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

  5. 5

    C#成员表达式Func <T,object>转换为Func <T,bool> MethodBinaryExpression

  6. 6

    将表达式转换为Expression <Func <T,bool >>

  7. 7

    将Expression <Func <T,bool >>转换为Expression <Func <T1,bool >>,以便T是T1的成员

  8. 8

    正文Expression <Func <T,bool >>的复杂编辑

  9. 9

    将谓词<T>转换为Func <T,bool>

  10. 10

    如何将IQueryable <T>转换为Expression <Func <T,bool >>?

  11. 11

    在IGrouping中使用Where(Expression <Func <T,bool >>)

  12. 12

    从Expression <Func <T,bool >>实体框架返回所有实体

  13. 13

    实体框架过滤器“ Expression <Func <T,bool >>”

  14. 14

    将Func <T,TProperty>转换为Expression <Func <T,Property >>

  15. 15

    如何从 Expression<Func<TSource, TSourceMember>> 转换为 Func<TSource, bool> 条件

  16. 16

    如何将简单的视图模型转换为Func <T,bool>谓词?

  17. 17

    Delete(Expression <Func <T,bool >>条件)MongoDB查询C#驱动程序

  18. 18

    Func <T,bool>的逻辑逆

  19. 19

    将Expression <Func <TModel,TValue >>转换为Expression <Func <TModel,bool >>

  20. 20

    将Expression <Func <TEntity,IEnumerable <TProperty >>> valueSelector,TValue []值转换为Expression <Func <TElement,bool >>

  21. 21

    C#如何解决Func <T,bool>中的矛盾性?

  22. 22

    如何修改Expression <Func <???,bool >>的类型参数?

  23. 23

    将Expression <Func <T1 >>转换为Expression <Func <T1,T2 >>

  24. 24

    C#将字符串解析为Func <T,bool>

  25. 25

    将Expression <Func <T,V >>转换为Expression <Func <T,Nullable <V >>>

  26. 26

    无法从 `Expression<Func<T1, T2>>` 转换为 `Expression<Func<object, object>>`

  27. 27

    具有约束条件的Moq表达式... It.Is <Expression <Func <T,bool >>>

  28. 28

    将Expression <Func <T,bool >>传递到存储库的单元测试查询

  29. 29

    为什么这个带有Expression <Func <T,bool>的模拟不匹配?

热门标签

归档