【问题标题】:LINQ - Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operatorLINQ - 本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外
【发布时间】:2012-12-06 14:44:43
【问题描述】:

这似乎是我遇到的最普遍的错误 - 多个关于它的 SO 帖子都提到了不同的问题 - 这是一个新问题 :)

枚举以下IQueryable 时出现上述错误:

注意itemsIQueryable<tblItem>keywordsstring

items = items.Where(p => p.heading.ToLower().Contains(keywords) || 
                         p.description.ToLower().Contains(keywords));

这令人困惑,因为正如错误所暗示的,当您使用 Contains 时它应该可以正常工作 - 有人知道如何解决这个问题吗?

【问题讨论】:

  • 您的where 声明正常。我刚刚尝试使用 LinqPad 和 NorthWind DB 进行类似的查询。正如@sgmoore 所说,问题可能出在items IQueryable

标签: linq linq-to-sql contains iqueryable


【解决方案1】:

如果关键字是一个支持枚举的集合,那么它应该是其他方式:

items = items.Where(p => keywords.Contains(p.heading.ToLower()) || 
                         keywords.Contains(p.description.ToLower()));

【讨论】:

  • 如果关键字是一个集合@Jimbo 的代码甚至不会编译。
  • 是的,你是对的。获取关键字变量的类型会很有帮助。
  • 抱歉,keywordsstring
  • 那么您提供的代码是正确的并且等同于items = items.Where(p => p.heading.ToLower() == keywords || p.description.ToLower() == keywords);
  • @Eugene: 不正确 - Contains 将测试关键字是否是字符串的 子字符串 - 请参阅 msdn.microsoft.com/en-us/library/dy85x1sa(v=vs.90).aspx
【解决方案2】:

如果 items 是 IQueryable 则错误可能存在并且与您的 where 语句无关。 您可以在添加 where 语句之前尝试强制枚举吗?

例如,假设您尝试将内存中的列表与数据表连接起来,在评估或枚举查询时会收到该错误

List<tblCategory> categories = tblCategory.ToList();

IQueryable<tblItem> items = (from r in tblItem 
            join c in categories on r.CategoryID equals c.Id select r);


//    items = items.Where(p => p.heading.ToLower().Contains(keywords) || 
//                             p.description.ToLower().Contains(keywords));



var firstMatch = items.FirstOrDefault();

// The error will be generated here even if the where is remmed out 

【讨论】:

    【解决方案3】:

    已解决

    感谢 sgmoore 的意见 - 它帮助我们找到了这个解决方案:

    IQueryable 列表分配给IEnumerable 列表,在其上运行ToList,然后在列表中使用我的过滤器效果很好。

    IEnumerable<tblItems> temp = items.ToList();
    
    temp = temp.Where(p => p.heading.ToLower().Contains(keywords) || 
                         p.description.ToLower().Contains(keywords));
    
    items = temp.AsQueryable();
    

    【讨论】:

    • 只要您可以将 tblItems 表中的所有内容放入内存并在内存中执行过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多