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)).

4

2 回答 2

6

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

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

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

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

这应该在 EF4 中工作。

于 2012-05-20T19:14:16.290 回答
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 页面或我的博客文章

于 2014-02-26T10:21:34.073 回答