使用Linq to Entities进行字符串搜索

4
我想在Linq to Entities中启用此功能(以便过滤发生在SQL Server上)?
public static bool ContainsAny(this string source, StringComparison comparison,
                               IEnumerable<string> searchTerms)
{
  return searchTerms.Any(searchTerm => source.Contains(searchTerm, comparison));
}

我的目标是使用上述函数搜索表格并通过过滤某一列来限制结果,即GetContacts().Where(c => c.FullName.ContainAny(searchTerm))


我假设 source 应该是 IEnumerable<string> 类型? - Douglas
2个回答

6

首先,如果可能的话(我不知道是否可能),在表达式中使用StringComparison并期望Linq 2 Entities将其翻译为正确的Sql语句是棘手的。

其次,在表达式中使用自定义函数,例如您的ContainsAny也很棘手。

因此,如果我是您,简单的解决方案是:

GetContacts().Where(c => searchTerms.Any(term => c.FullName.Contains(term)))

这应该在EF4中正常工作。


1
+1 是指出“Any”可以与本地序列一起使用(Linq-to-Sql 无法做到)。但是,“StringComparison”部分没有涵盖。 - Gert Arnold
我明白了。由于默认的SQL字符串比较是不区分大小写的,所以这应该正好符合我的要求。无论如何,如果你找到了一种方法来实现StringComparison,请过来并在这里留言,这样我就可以将其包含在我的扩展库中...谢谢! - Shimmy Weitzhandler

0

看一下我创建的NuGet包

http://www.nuget.org/packages/NinjaNye.SearchExtensions

这将使以下操作(以及更多操作)成为可能,将返回在指定属性中出现搜索词的结果。
var result = GetContacts().Search("searchTerm", c => c.FullName);

如果您想搜索多个术语,可以执行以下操作:

var result = GetContacts().Search(searchTerms, c => c.FullName);

以上代码将返回任何搜索词在属性中出现的结果

这将构建一个表达式树,在数据库而不是内存中执行搜索,因此只有匹配的结果从服务器返回。

欲了解更多信息,请查看项目GitHub页面或我的博客文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接