【问题标题】:Method 'Boolean Contains(System.String)' has no supported translation to SQL方法 'Boolean Contains(System.String)' 不支持对 SQL 的转换
【发布时间】:2009-03-09 05:34:42
【问题描述】:

“方法 'Boolean Contains(System.String)' 不支持对 SQL 的转换。”

查询是 IsQueryable 但这停止工作:

foreach (string s in collection1)
{
       if (s.Length > 0)
                {
                    query = query.Where(m => m.collection2.Contains(s));

                }
}

更新:当我进行查询“ienumerable”而不是 iqueryable 时,它​​可以工作。使用 linq 而不是通过循环迭代获得相同结果的方法是什么?

【问题讨论】:

  • 你能在进入这个循环之前发布你的查询吗?
  • 使用纯 LINQ 不会改变任何事情——它也有同样的问题。由于未知的原因,如果 LINQ 将“奇怪”集合检测为 HashSet,它不会将其用作 IEnumerable,用户必须将他/她的集合直接转换为 IEnumerable——然后将 Containts 正确转换为 SQL(我假设为 IN)。

标签: sql linq-to-sql


【解决方案1】:

试试这个:

query = query.Where(m => m.collection2.ToList().Contains(s));
                                       ^^^^^^^^

【讨论】:

  • +1 - 似乎要让 LINQ to SQL 生成 SQL 'IN' 子句,您的集合的 compile time 类型必须是 List。在我的测试中,我有一个 List 的实例,但查询将其视为 IList,我得到了问题中提到的错误。但是,确保查询在编译时将其视为 List 修复了它。
【解决方案2】:

看看这个来自stackoverflow的answer

看起来生成的查询需要访问数据库中的某些内容 无法到达,因为信息在内存中。

【讨论】:

  • 尽管如此,内存中的数据可以像任何其他查询一样传输到 SQL Server。包含应翻译为 IN。
【解决方案3】:

由于 m.collection2 在数据库中,所以不要使用 Contains。任意使用

m.collection2.Any(x => x == s)

【讨论】:

    【解决方案4】:

    您看到的错误似乎来自集合集合 2。您是否尝试将 m.collection2 包装在另一个返回 true 或 false 的函数中?这是 LINQ 语法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多