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

时间:2012-05-20 07:16:03

标签: c# .net string linq linq-to-entities

我想在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))

2 个答案:

答案 0 :(得分:6)

首先,在Expressions中使用StringComprison并且期望Linq 2实体将其转换为正确的Sql语句是非常棘手的(如果可能的话,我不知道)。

其次,在表达式中使用像 ContainsAny 这样的自定义函数也很棘手。

所以,如果我是你,那么简单的解决方案就是:

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

哪个适用于EF4。

答案 1 :(得分: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);

上述内容将返回任何搜索字词出现在属性

中的结果

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

有关详细信息,请查看 projects GitHub page blog posts