无法解决此问题:
/// <summary>
/// Retrieve search suggestions from previous searches
/// </summary>
public static string[] getSearchSuggestions(int SectionID, string Query)
{
string[] Suggestions;
string[] Words = Query.Split(' ');
using (MainContext db = new MainContext())
{
Suggestions = (from c in db.tblSearches
where c.SectionID == SectionID &&
Words.Any(w => c.Term.Contains(w))
select c.Term).ToArray();
}
return Suggestions;
}
我明白了:
System.NotSupportedException:除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。
我想返回字段c.Term
包含Words
数组中的任何字词的记录。我也希望按照比赛总数排序,但这看起来真的很难!我找到了this MSDN。但我也无法使用我的查询。还found this but it's not working。
答案 0 :(得分:6)
好吧,在插上足够的东西后,我意识到问题不是Any或Contains。 Linq to SQL不喜欢将本地序列(单词)与SQL集合(db.tblSearches)组合在一起。因此,为了实现这一目标,您必须将其分解为两个单独的查询。
public static string[] getSearchSuggestions(int SectionID, string Query)
{
string[] Suggestions;
string[] Words = Query.Split(' ');
using (MainContext db = new MainContext())
{
string[] all = (from c in db.tblSearches
where c.SectionID == SectionID
select c.Term).ToArray();
Suggestions = (from a in all
from w in Words
where a.Contains(w)
select a).Distinct().ToArray();
}
return Suggestions;
}
请注意,在第二个查询中,Contains
区分大小写,因此您可能必须添加不区分大小写的扩展方法,或者去旧学校并踢它们.ToUpper()
。我在我的一个上下文中在4.0中运行它并且它正确地返回了所有88个字符串(在可能的9814中)。虽然这是一个彻底的PITA。在这个问题上确定+1。
修改强>
在最终答案中添加了.Distinct()
。
答案 1 :(得分:3)
首先将数组转换为列表
List<string> wordList = Words.ToList();
然后按如下方式更改您的linq查询:
Suggestions = (from c in db.tblSearches
where c.SectionID == SectionID &&
Words.Contains(c.Term)
select c.Term).ToArray();
我想我看到了你的问题。在原始查询中,您正在使用c.Term.Contains()... Contains是一个扩展方法,需要在实现Enumerable的对象上调用,因此您无法在从数据库调用返回的字段上调用它。这就是为什么回答你问题的其他用户说你需要在你的Contains中翻转一下,因为它永远不会让你在c.Terms上进行调用。
答案 2 :(得分:2)
您需要翻转Contains子句的顺序:
Suggestions = (from c in db.tblSearches
where c.SectionID == SectionID &&
Words.Contains(w => c.Term)
select c.Term).ToArray();