如果有人非常熟悉Linq.Dynamic命名空间,我可以使用一些帮助 - 无法在互联网上找到任何深入的资源。
基本上我正在使用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&gt; 15”或其他东西。
这就是'GetExpression'函数的工作原理,它有两种类型 - 一种是输入类型,另一种是输出类型,最终生成通常用Func委托创建的类型。它还需要一个表示查询的字符串和一个值为params的对象[],它们分别是上面的'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()才能使用它?或许我需要创建另一个。哪个扩展名?
答案 0 :(得分:2)
您的GetExpression返回一个Expression类型 - DynamicQueryable.Where方法,当用作扩展方法时,需要一个字符串作为第一个参数。
您需要打电话给这里看起来像这样:
var query = db.SysEventLogT.Where("Age > @0", 15);
此外,您可以尝试以下内容,只是为了明确:
var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15);
请注意,如果更简单,您可以构建包含完整过滤器的sting,而不是使用params object []参数:
var query = db.SysEventLogT.AsQueryable().Where("Age > 15");