【问题标题】:What is this? Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator这是什么?本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外
【发布时间】:2015-03-04 12:18:05
【问题描述】:

我正在尝试运行此查询,但它返回错误:base = {"Local sequence cannot be used in LINQ to SQL implementations of query operator except the Contains operator."} 我不明白这个消息。该语句确实使用 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;
        }

【问题讨论】:

  • 错误消息中提到的本地序列可能是stringsToCheck(以及从中检索到的任何内容),它被传递给eventTable.Where(从中获取一条SQL语句需要生成)。
  • 这行得通:eventTable = eventTable.Where(o => o.SQLPendingEvent.EventText.ToLower().Contains("fail"));

标签: c# linq


【解决方案1】:

使用Contains() 运算符是不够的。错误消息告诉您的是 只有 Contains() 运算符可以与 stringsToCheck 等本地序列一起使用。

在这里,您将本地序列传递给Where() 运算符。那是无效的。如果没有 Contains() 运算符,它是无效的,并且添加 Contains() 运算符无助于使其有效。它必须使用Contains() 运算符。

根据文本实际包含的内容,您可以像这样重写子句:

var newTable = eventTable.Where(r => r.RepairCode.Description
    .IndexOf("fail", StringComparison.OrdinalIgnoreCase) >= 0);

只有当您知道Description 属性将仅包含单词“fail”时该单词实际上只是“fail”或“failed”(不包括大小写),这才有效。如果文本还可以包含例如“failure”、“fails”、“failing”等,那么以上在逻辑上并不相似。

另外,我不记得是否允许可查询的Where() 运算符。您可能会遇到完全相同的问题。

一种可行的方法是强制 Where() 操作在本地完成,而不是作为 SQL 查询。考虑到您正在执行的过滤类型,无论如何都可能需要。在这种情况下,转换为 IEnumerable 应该可以:

var newTable = eventTable.AsEnumerable().Where(
    r => stringsToCheck.Any(
        stringToCheck => r.RepairCode.Description.Contains(stringToCheck)));

【讨论】:

    【解决方案2】:

    我使用以下方法让它工作:

        eventTable = eventTable.Where(o => o.SQLPendingEvent.EventText.ToLower().Contains("fail")); 
    

    这成功捕获了Fail、fail、Failed、failed、Failure或failure。

    【讨论】:

      【解决方案3】:

      您需要检查stringsToCheck 是否包含字符串,而不是相反。

      var newTable = eventTable.Where(r => stringsToCheck.Contains(r.RepairCode.Description));
      

      【讨论】:

      • 这种说法在 Pharylon 中是错误的。我正在寻找包含任何 stringsToCheck 的 r.RepairCode.Description。
      猜你喜欢
      • 2012-12-06
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多