如何在Linq中使用字符串数组所有运算符

时间:2016-05-18 13:10:45

标签: c# linq

我的查询如下:

string[] keys = txtSearch.Text.Split(' ');

var query = (from m in db.Messages
             join r in db.Recievers on m.Id equals r.Message_Id
             where (keys.All(k => (m.MessageText + m.Comments.Select(cmt => cmt.CommentText).ToString()).Contains(k)))
             select m.Id).Distinct();

我收到以下错误:

  

本地序列不能用于LINQ to SQL的查询实现   除Contains()运算符之外的运算符。

3 个答案:

答案 0 :(得分:2)

问题是您的查询无法转换为SQL(或者至少提供程序未编程执行此操作)。如果事实我不知道查询将如何在SQL中看到:"给我所有消息,其中所有这些关键词都包含在文本或注释中#34;

我的第一个想法是多个请求,每个键值一个:

List<int> allIDs = new List<int>();
foreach(string key in keys)
{
    var query = (from m in db.Messages
                 join r in db.Recievers on m.Id equals r.Message_Id
                 where m.MessageText.Contains(key) || m.Comments.Any(cmt => cmt.CommentText.Contains(key)
                 select m.Id).Distinct();
    allIds.AddRange(query);
}

但您甚至可能需要在单独的查询中搜索消息和评论。

显然你喜欢在一个查询中执行它,但我不知道如何在不使用游标的情况下在SQL中完成。如果您能够提供一个能够为您提供正确结果的SQL语句,那么直接调用该SQL语句可能更容易,而不是尝试编写一个编译为等效SQL的Linq语句。

答案 1 :(得分:0)

使用本地集合时,只能在linq中使用Array.Contains()来查询SQL查询。

您需要根据此规则更改查询。

答案 2 :(得分:0)

Where运算符返回一个布尔值,它还确定所有元素是否满足条件。正如您所枚举的那样,只要条件不满足,枚举就会停止并返回true或false。

我相信您期待setState功能,返回满足搜索匹配要求的所有指定元素。

我不相信您正确使用了查询。