在 DynamicLinq 查询中使用扩展方法

Posted

技术标签:

【中文标题】在 DynamicLinq 查询中使用扩展方法【英文标题】:Use an extension method in a DynamicLinq-query 【发布时间】:2011-10-02 22:06:08 【问题描述】:

我想扩展 Telerik RadGrid 的过滤器行为。 例如,如果用户使用以下单词“michèle”过滤网格,它还应该返回包含“michèle”的行。 Telerik RadGrid 不支持开箱即用。 因此我为String类型写了一个扩展方法:public static bool IsSqlLikeMatch( this string input, string pattern ) [...]

作为第二步,我像这样替换了 RadGrid 的 FilterExpression:

this.MasterTableView.FilterExpression.Replace( "Contains", "IsSqlLikeMatch" );

但不幸的是,我收到以下错误消息:

“String”类型中不存在适用的方法“IsSqlLikeMatch”

Telerik RadGrid 使用 DynamicLinq。因此,我的问题是:“我可以在 DynamicLinq 中使用扩展方法吗”?我该如何做到这一点?

编辑 09/09/2011: 我已经联系了 Telerik 支持,这是他们的回答:

很遗憾,您无法扩展 Telerik.Web.UI.dll 中包含的动态 linq 函数。因此,您对 DynamicLinq 类的更改不会影响 RadControls 内部使用的 ExpressionParser。但是,您可以尝试更改 Dynamic Linq 库并通过从 RadGrid 解析中获取过滤器表达式来执行自定义过滤,并将它们传递给更改后的 Dynamic Linq 类的方法并将 RadGrid 绑定到返回的数据。我附上了一个小示例,演示了如何使用 RadGrid 的过滤/排序表达式对 ObjectDataSource 进行过滤、排序和分页。

【问题讨论】:

方法IsSqlLikeMatch在什么命名空间? 它写了一个包含我所有扩展方法的类,但我没有为这个类指定命名空间。 您可能想尝试将其放在 System.Linq 命名空间中 - 我不确定我是否建议将其作为长期解决方案,但是看看该方法是否会很有趣找到了。 @Kragen 好主意!但不幸的是它不起作用...... 我找到了这篇文章 (blog.walteralmeida.com/2010/05/…)...也许这是要走的路。我试试看。 【参考方案1】:

为了使用扩展方法,您必须有一个using 指令,用于定义扩展方法的类的命名空间。

所以试着把你的类放在一个命名空间中,并为它添加using

另外,请确保该类被定义为 public static。

【讨论】:

我在命名空间 System.Linq.Dynamic 中添加了我的静态类,但它没有被识别。 如果还是没有解决问题,可以贴出不起作用的代码,让大家看看是怎么回事。 我在我的问题中添加了来自 Telerik 支持的答案。不是一个理想的解决方案...

以上是关于在 DynamicLinq 查询中使用扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

DynamicLinq:如何使用没有类名的自定义类方法来 ParseLambda

使用扩展方法/查询语法在 LINQ 中需要左外连接

有没有办法将简单的 LINQ 查询封装在可与 LINQ to Entities 查询一起使用的扩展方法中?

通过扩展方法过滤子查询

Entity Framework lambda 扩展方法在啥时候将查询发送到数据库?

使用IQueryable扩展方法实现复杂查询条件