我有以下代码块:
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
bar
和baz
。我想检查i.ImageTitle以查看它是否包含任何这些单词。所以:
foo tball
将返回bar
ba 将不会被退回
我确定我必须使用.Any和可能.Contains,但我不确定如何配置它们。
答案 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;