使用未知类型执行DynamicExpression

sea*_*ean 6 c# linq lambda expression-trees dynamic-linq

如果有人非常熟悉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);
}
Run Code Online (Sandbox Code Playgroud)

QueryFilter的位置是:

public class QueryFilter 
{
    string propertyName;
    ExpressionType operationType;
    object value;
}
Run Code Online (Sandbox Code Playgroud)

它代表一个简单的二进制函数,如"Age> 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);
Run Code Online (Sandbox Code Playgroud)

产生以下错误,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT>
Run Code Online (Sandbox Code Playgroud)

不包含'Where'的定义和最佳扩展方法重载

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 
Run Code Online (Sandbox Code Playgroud)

有一些无效的论点.

我知道我的DataContext实例实际上将sql表视为属性...我是否需要以某种方式反映GetProperty()才能使其工作?或许我需要创建另一个.哪个扩展?

gor*_*ric 2

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

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

var query = db.SysEventLogT.Where("Age > @0", 15); 
Run Code Online (Sandbox Code Playgroud)

另外,为了明确起见,您可以尝试以下操作:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 
Run Code Online (Sandbox Code Playgroud)

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

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
Run Code Online (Sandbox Code Playgroud)