我的查询如下:
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()运算符之外的运算符。
答案 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
功能,返回满足搜索匹配要求的所有指定元素。
我不相信您正确使用了查询。