如果有人非常熟悉 Linq.Dynamic 命名空间,我可以使用一些帮助——在 Internet 上找不到任何深入的资源。
基本上我正在使用 DynamicExpression.ParseLambda 创建一个在编译时类型未知的表达式,
public Expression GetExpression(Type t, List<QueryFilter> filters)
{
// pseudo code
// extracts a string representation of the query as 'expressionString'
return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values);
}
QueryFilter 在哪里:
public class QueryFilter
{
string propertyName;
ExpressionType operationType;
object value;
}
它代表一个简单的二进制函数,如“Age > 15”或其他东西。
这就是“GetExpression”函数的工作方式,它采用两种类型——一种是输入类型,一种是输出类型,最终生成通常使用 Func 委托创建的内容。它还接受一个表示查询的字符串和一个值的参数 object[],它们分别是上面的 'expressionString' 和 'values'。
但是,我无法使用从 SqlMetal(.dbmc 文件)生成的 DataContext 在 LINQ-to-SQL 中执行动态表达式。
DatabaseContext db = new DatabaseContext(connectionString);
var filter = DynamicExpressionBuilder.
GetExpression(typeof(SysEventLogT), sysEventFilters)
var query = db.SysEventLogT.Where(filter);
产生以下错误,
System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>
不包含“Where”的定义和最佳扩展方法重载
System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[])
有一些无效的论点。
我知道我的 DataContext 实例实际上将 sql 表视为属性......我是否需要以某种方式反映 GetProperty() 才能使其工作?或者也许我需要创建另一个 .Where 扩展?