C# 如何在Linq中使用字符串数组All运算符
我的质询如下:C# 如何在Linq中使用字符串数组All运算符,c#,linq,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).
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到SQL实现
除Contains()运算符之外的运算符
使用本地集合时,只能在linq to SQL查询中使用
Array.Contains()
。
您需要根据此规则更改查询。在使用本地集合时,只能在linq to SQL查询中使用
Array.Contains()
。
您需要根据此规则更改查询。运算符
All
返回一个布尔值,它还确定是否所有元素都满足一个条件。在枚举时,只要不满足条件,枚举就会停止并返回true或false
我相信您期望的是功能,其中
返回所有满足搜索匹配条件的指定元素
我认为您没有正确地使用查询。运算符
All
返回一个布尔值,它还确定所有元素是否满足一个条件。在枚举时,只要不满足条件,枚举就会停止并返回true或false
我相信您期望的是功能,其中
返回所有满足搜索匹配条件的指定元素
我认为您没有正确地使用查询。问题是您的查询无法转换为SQL(或者至少提供程序没有编程这样做)。如果事实上我不知道该查询在SQL中会是什么样子:“给我所有这些关键字都包含在文本或注释中的消息” 我的第一个想法是处理多个请求,每个键值对应一个请求:
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);
}
List allIDs=new List();
foreach(字符串键入键)
{
var query=(从db.Messages中的m开始)
在数据库中加入r。m.Id上的接收器等于r.Message\u Id
其中m.MessageText.Contains(键)| m.Comments.Any(cmt=>cmt.CommentText.Contains(键)
选择m.Id).Distinct();
allIds.AddRange(查询);
}
但您甚至可能需要在单独的查询中搜索消息和注释
显然,您更愿意在一个查询中完成这项工作,但我不知道如何在SQL中不使用游标就可以完成这项工作。如果您可以生成一个SQL语句来提供正确的结果,那么直接调用该SQL语句可能比尝试生成一个编译为等效SQL的Linq语句更容易。问题在于,您的查询无法转换为SQL(或者至少提供商没有这样做的程序)。如果事实上我不知道该查询在SQL中会是什么样子:“给我所有消息,其中所有这些关键字都包含在文本或注释中” 我的第一个想法是处理多个请求,每个键值对应一个请求:
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);
}
List allIDs=new List();
foreach(字符串键入键)
{
var query=(从db.Messages中的m开始)
在数据库中加入r。m.Id上的接收器等于r.Message\u Id
其中m.MessageText.Contains(键)| m.Comments.Any(cmt=>cmt.CommentText.Contains(键)
选择m.Id).Distinct();
allIds.AddRange(查询);
}
但您甚至可能需要在单独的查询中搜索消息和注释
显然,您更愿意在一个查询中完成这项工作,但我不知道如何在SQL中不使用游标就可以完成这项工作。如果您可以生成一个SQL语句来提供正确的结果,那么直接调用该SQL语句可能比尝试生成一个编译为等效SQL的Linq语句更容易。似乎您不能将本地源字符串[]键与db源一起使用,因为where子句u正在使用本地源。使用linq作为select*从本地\u源进行翻译,然后try@Prathyush附带问题:您希望从
Select(cmt=>cmt.CommentText).ToString()中得到什么
?@IvanStoev,我希望所有注释都连接在一起。如果您希望使用concated值,则您的查询不正确,因为Greg也建议使用相同的值。似乎您不能使用本地源字符串[]where子句u中db source为的键使用的是本地源。使用linq作为select*from local_source进行翻译,然后try@Prathyush附带问题:您希望从Select(cmt=>cmt.CommentText).ToString()中得到什么
?@IvanStoev,我希望所有注释都连接在一起。如果您希望的是concated值,那么您的查询是不正确的,因为Greg也提出了同样的建议。