首页 / C# / 在linq查询中使用C#扩展方法作为谓词
在linq查询中使用C#扩展方法作为谓词
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在linq查询中使用C#扩展方法作为谓词,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1650字,纯文字阅读大概需要3分钟。
内容图文
我实现了扩展方法来规范化这篇文章中描述的字符串:LINQ Where Ignore Accentuation and Case
如果我做这样的事情,这种方法就像一个魅力:
employee.AsQueryable().Where(t=>t.Text.ToLower().RemoveDiacritics().Contains("ced"));
现在,我想通过动态生成where子句的谓词来更一般地使用它.
var values = filters.Select(f => f.Value is string && f.IgnoreAccent
?((string)f.Value).RemoveDiacritics()
:f.Value).ToArray();
// Create a predicate expression
string predicate = filter.ToExpression(filters);
// Use the Where method of Dynamic Linq to filter the data
queryable = queryable.Where(predicate, values);
谓词将如下所示:
(Text.ToLower().RemoveDiacritics().Contains(@0))
由于未知原因,执行时出现以下错误消息:
No applicable method ‘RemoveDiacritics’ exists in type ‘String’
但是,如果我在其他地方使用它,这种方法实际上可行.
任何想法在这里有什么不对?
请注意,ToLower()在这种情况下就像魅力一样.
在此先感谢您的帮助!
编辑
以下是扩展方法的定义:
public static class StringExtension
{
public static string RemoveDiacritics(this String s)
{
String normalizedString = s.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < normalizedString.Length; i++)
{
Char c = normalizedString[i];
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
stringBuilder.Append(c);
}
return stringBuilder.ToString();
}
}
解决方法:
Dynamic Linq不支持扩展方法.
原因是Dynamic Linq使用反射,很难找到扩展方法的实现,并使用反射调用它.所以动态Linq的作者并没有为此烦恼.
因此,您必须像常规静态方法一样调用扩展方法:
var values = filters.Select(f => f.Value is string && f.IgnoreAccent
?StringExtensions.RemoveDiacritics((string)f.Value)
:f.Value).ToArray();
内容总结
以上是互联网集市为您收集整理的在linq查询中使用C#扩展方法作为谓词全部内容,希望文章能够帮你解决在linq查询中使用C#扩展方法作为谓词所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。