LINQ包含来自字符串数组的一个匹配项

时间:2011-09-09 16:27:14

标签: c# string linq linq-to-sql search

无法解决此问题:

    /// <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

3 个答案:

答案 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();