![](/img/trans.png)
[英]Linq to Entities, match where value contains one or more strings
[英]LINQ contains one match from array of strings
无法使其工作:
/// <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
数组中的任何Words
。 我也希望按照比赛总数排序,但这看起来真的很难! 我找到了这个MSDN 。 但我也无法使用我的查询。 也找到了这个,但它不起作用 。
好吧,在插上足够的东西后,我意识到问题不是Any或Contains。 Linq to SQL不喜欢将本地序列(单词)与SQL集合(db.tblSearches)组合在一起。 因此,为了实现这一点,您必须将其分解为2个单独的查询。
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()
到最终答案。
首先将数组转换为列表,
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上进行调用。
您需要翻转Contains子句的顺序:
Suggestions = (from c in db.tblSearches
where c.SectionID == SectionID &&
Words.Contains(w => c.Term)
select c.Term).ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.