这是什么?除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现

时间:2015-03-04 12:18:05

标签: c# linq

我正在尝试运行此查询并返回错误: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;
        }

3 个答案:

答案 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));