6

如果有人非常熟悉 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 扩展?

4

1 回答 1

2

您的 GetExpression 正在返回一个 Expression 类型 - DynamicQueryable.Where 方法在用作扩展方法时,需要一个字符串作为第一个参数。

您需要致电 Where 看起来像这样:

var query = db.SysEventLogT.Where("Age > @0", 15); 

此外,您可以尝试以下操作,只是为了明确:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

请注意,如果更容易,您可以构建一个包含完整过滤器的字符串,而根本不使用 params object[] 参数:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
于 2010-12-31T13:12:17.190 回答