不能在表达式树的 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 预期结果。
代码无法编译,因为 tableType
,System.Type
类型的变量不能用作泛型函数的类型参数。
但是,您应该能够通过将对通用 Lambda<Func<...>>
的调用替换为对非通用 Lambda
:
的调用来进行此编译和 运行
var whereCallExpression = Expression.Call(typeof(Queryable), "Where", new[] { tableType },
tableQuery.Expression, Expression.Lambda(predicateBody, pe));
我试图在动态选择的 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 预期结果。
代码无法编译,因为 tableType
,System.Type
类型的变量不能用作泛型函数的类型参数。
但是,您应该能够通过将对通用 Lambda<Func<...>>
的调用替换为对非通用 Lambda
:
var whereCallExpression = Expression.Call(typeof(Queryable), "Where", new[] { tableType },
tableQuery.Expression, Expression.Lambda(predicateBody, pe));