使用未知类型执行DynamicExpression

时间:2010-12-31 05:35:09

标签: c# linq expression-trees dynamic-linq lambda

如果有人非常熟悉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()才能使用它?或许我需要创建另一个。哪个扩展名?

1 个答案:

答案 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");