小编sea*_*ean的帖子

使用未知类型执行DynamicExpression

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

c# linq lambda expression-trees dynamic-linq

6
推荐指数
1
解决办法
3321
查看次数

标签 统计

c# ×1

dynamic-linq ×1

expression-trees ×1

lambda ×1

linq ×1