gpt4 book ai didi

c# - 执行未知类型的 DynamicExpression

转载 作者:太空狗 更新时间:2023-10-29 21:55:46 26 4
gpt4 key购买 nike

如果有人非常熟悉 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 委托(delegate)创建的内容。它还采用表示查询的字符串和值的参数对象[],分别是上面的'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 表视为属性...我是否需要以某种方式反射(reflect) GetProperty() 才能使其工作?或者我可能需要创建另一个 .Where 扩展名?

最佳答案

您的 GetExpression 正在返回一个表达式类型 - 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"); 

关于c# - 执行未知类型的 DynamicExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com