LINQ - 字符串包含数组中的任何元素

时间:2014-12-20 20:20:43

标签: c# linq

我有以下代码块:

string[] searchTerms = Request.QueryString["search"].Split(' ');
var searchResults = from i in Website.Images
                    join u in Website.Users on i.User_Id equals u.Id
                    where i.ImageTitle == searchTerms.Any()

searchTerms将包含多个字词,例如foo barbaz。我想检查i.ImageTitle以查看它是否包含任何这些单词。所以:

将返回

foo tball

将返回

bar

ba 将不会被退回

我确定我必须使用.Any和可能.Contains,但我不确定如何配置它们。

1 个答案:

答案 0 :(得分:3)

首先想到的是:

var searchResults = from i in Website.Images
                    join u in Website.Users on i.User_Id equals u.Id
                    where searchTerms.Any(
                                term => i.imageTitle.Contains(term))
                    select i;

然而,这并不完全正确,因为您会收到错误:

  

异常信息:       异常类型:System.NotSupportedException       异常消息:除了Contains()运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。

这是因为searchTerms数组无法转换为SQL构造。

通常的解决方法是使用PredicateBuilder从多个搜索字词创建谓词,然后在最终查询中使用它:

var predicate = PredicateBuilder.False<YourImageType>();
foreach(string searchTerm in searchTerms)
   predicate = predicate.Or(image => 
                      image.imageTitle.Contains(searchTerm));

var searchResults = from i in Website.Images.Where(predicate)
                    join u in Website.Users on i.User_Id equals u.Id
                    select i;