不能在表达式树的 lambda 中使用动态委托参数

Can't use dynamic delegate parameter in lambda of expression tree

我试图在动态选择的 table 上应用一个简单的 "Where" 子句。但是,子句将应用于的 table 字段也是动态的,我无法弄清楚如何使该部分工作。获取动态 table 工作正常。

using (var context = new DBEntities())
{
    var type = context.GetType();
    var tableProperty = type.GetProperty("tableName");
    var tableGet = tableProperty.GetMethod;
    var tableContent = tableGet.Invoke(context, null);
    var tableQuery = (IQueryable)tableContent;
    var tableType = tableQuery.ElementType;

    var pe = Expression.Parameter(tableType, "tableType");
    var left = Expression.PropertyOrField(pe, "fieldName");
    var right = Expression.Constant("fieldValue");
    var predicateBody = Expression.Equal(left, right);

    var whereCallExpression = Expression.Call(typeof(Queryable), "Where", new[] { tableType },
        tableQuery.Expression, Expression.Lambda<Func<tableType, bool>>(predicateBody, pe));

    IQueryable<string> results = tableQuery.Provider.CreateQuery<string>(whereCallExpression);
}

由于Expression.Lambda<Func<tableType, bool>>(predicateBody, pe),此代码块将无法编译。如果我对表达式相关代码的类型进行硬编码,则此示例会运行并且 returns 预期结果。

代码无法编译,因为 tableTypeSystem.Type 类型的变量不能用作泛型函数的类型参数。

但是,您应该能够通过将对通用 Lambda<Func<...>> 的调用替换为对非通用 Lambda:

的调用来进行此编译和 运行
var whereCallExpression = Expression.Call(typeof(Queryable), "Where", new[] { tableType },
    tableQuery.Expression, Expression.Lambda(predicateBody, pe));