在 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 to Entities 查询一起使用的扩展方法中?