我正在尝试运行此查询并返回错误:base = {"本地序列不能用于查询运算符的LINQ to SQL实现,但Contains运算符除外。"} 我不明白这个消息。该语句确实使用th Contains运算符。我做错了什么?
DataClassOnSiteV3DataContext OnSiteV3 = new DataClassOnSiteV3DataContext();
var eventTable = (from s in OnSiteV3.SQLPendingEvents
from r in OnSiteV3.RepairCodes.Where(o => s.EventType == o.KeyRepairCode).DefaultIfEmpty()
from a in OnSiteV3.RepairCodes.Where(o => o.Type == r.KeyRepairCode).DefaultIfEmpty()
select new { SQLPendingEvent = s, RepairCode = r, Answers = a });
eventTable = eventTable.Where(r => r.SQLPendingEvent.EventCode == _eventCode && r.SQLPendingEvent.EventDateTime > _EventDateTime);
if (CheckBox1.Checked)
{
string someCommaSeparatedStrings = "Fail,fail,Failed,failed";
var stringsToCheck = someCommaSeparatedStrings.ToLower().Split(',').ToList();
var newTable = eventTable.Where(r => stringsToCheck.Any(stringToCheck =>
r.RepairCode.Description.Contains(stringToCheck))); *** ERROR OCCURS HERE
eventTable = newTable;
}
答案 0 :(得分:0)
使用Contains()
运算符是不够的。错误消息告诉您的是仅 Contains()
运算符可以与stringsToCheck
等本地序列一起使用。
在这里,您将本地序列传递给Where()
运算符。那是无效的。没有Contains()
运算符,它无效,添加Contains()
运算符并不能使其有效。它必须仅使用Contains()
运算符。
根据文本实际包含的内容,您可以重写这样的条款:
var newTable = eventTable.Where(r => r.RepairCode.Description
.IndexOf("fail", StringComparison.OrdinalIgnoreCase) >= 0);
只有当你知道Description
属性只包含单词"失败"实际上,这个词实际上只是"失败"或者"失败" (不计算案例)。如果文本也可以包含例如"失败","失败","失败"等等,那么上述内容在逻辑上并不相似。
另外,我也不记得我是否会允许可查询的Where()
运算符。您可能会遇到完全相同的问题。
一种可行的方法是强制Where()
操作在本地完成,而不是作为SQL查询。其中,考虑到您正在进行的过滤类型,无论如何都可能需要。在这种情况下,转换为IEnumerable
应该有效:
var newTable = eventTable.AsEnumerable().Where(
r => stringsToCheck.Any(
stringToCheck => r.RepairCode.Description.Contains(stringToCheck)));
答案 1 :(得分:0)
我使用以下方法开始工作:
eventTable = eventTable.Where(o => o.SQLPendingEvent.EventText.ToLower().Contains("fail"));
成功捕获失败,失败,失败,失败,失败或失败。
答案 2 :(得分:-1)
您需要检查stringsToCheck
是否包含字符串,而不是相反。
var newTable = eventTable.Where(r => stringsToCheck.Contains(r.RepairCode.Description));