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

Tom*_*len 9 c# linq string search linq-to-sql

无法使其工作:

    /// <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;
    }
Run Code Online (Sandbox Code Playgroud)

我明白了:

System.NotSupportedException:除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现.

我想返回字段c.Term包含Words数组中任何单词的记录.我也希望按照比赛总数排序,但这看起来真的很难!我找到了这个MSDN.但我也无法使用我的查询.也找到了这个,但它不起作用.

Joe*_*ton 6

好吧,在插上足够的东西后,我意识到问题不是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;
}
Run Code Online (Sandbox Code Playgroud)

请记住,在第二个查询中,Contains区分大小写,因此您可能必须添加不区分大小写的扩展方法或者去旧学校并踢它们.ToUpper().我在我的一个上下文中在4.0中运行它并且它正确地返回了所有88个字符串(在可能的9814中).虽然这是一个彻底的PITA.在这个问题上确定+1.

编辑: 添加.Distinct()到最终答案.