【问题标题】:Building a Lambda Expression with Where Clause on multiple joined tables?在多个连接表上使用 Where 子句构建 Lambda 表达式?
【发布时间】:2022-10-04 20:47:27
【问题描述】:

我必须在我的 LINQ 查询中的 db1 表上添加一个 .Where() 子句,如下所示:

var query = from db1 in db.db1
                              join db2 in db.database2 on db1.atr1 equals db2.atr1
                              join db3 in db.database3 on db1.atr1 equals db3.atr1
                              select new { db1, db2, db3};

我已将 Lambda 表达式添加到没有连接子句的查询中,但无法弄清楚您何时拥有这些“嵌套”表。代替:

query = query.Where(t => t.attr5.Contains("String"));

它必须是:

query = query.Where(t => t.db1.attr5.Contains("String"));

我为 Where() 构建 lambda 的代码如下所示:

ParameterExpression eParam = Expression.Parameter(tableType, "innerTable");
MethodInfo method = filterValue.GetType().GetMethod("Contains", new Type[] { typeof(string) }); // filterValue is just a string
MethodCallExpression call = Expression.Call(Expression.Property(eParam, filterField), method, Expression.Constant(filterValue));
Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, eParam);
currentQuery = currentQuery.Where(lambda);

tableType 是一个变量,我在其中获得带有 select new 语句的表的 PropertyType,但它会抛出错误,因为它与对象 select new { db1, db2, db3 } 不匹配。

我假设我需要再做一个:

ParameterExpression eParam = Expression.Parameter(typeof(T), "item");?不知何故.MethodCallExpression 之前,但不确定。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    我想通了。我不得不从这个答案中得到:

    https://stackoverflow.com/a/18896870/6368685

    但我没有使用:

    var lambdaExpression = Expression.Lambda(expression, parameter);
    return lambdaExpression;
    

    相反,我将expression 变量传递给我需要在构建 lambda 之前构建的 MethodCallExpression:

    MethodInfo method = filterValue.GetType().GetMethod("Contains", new Type[] { typeof(string) });
    MethodCallExpression call = Expression.Call(expression, method, Expression.Constant(filterValue));
    Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, argLambda);
    currentQuery = currentQuery.Where(lambda);
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多