方法'Boolean Contains(System.String)'没有被支持翻译为SQL。

15

"方法 'Boolean Contains(System.String)' 没有支持的 SQL 翻译。"

查询是可查询的,但这已经停止工作:

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

                }
}

更新:当我将查询“ienumerable”而不是“iqueryable”时,它可以正常工作。如何使用LINQ获得相同的结果,而不是通过循环迭代?


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

26

试试这个:

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

3
似乎要让 LINQ to SQL 生成 SQL 的 'IN' 语句,你的集合在编译时必须是 List<T> 类型。在我的测试中,我有一个 List<T> 实例,但查询将其视为 IList<T>,因此出现了问题。不过,确保查询在编译时将其视为 List<T> 类型就可以解决问题。 - Alex Humphrey

2
看看stackoverflow上的这个答案
看起来生成的查询需要访问数据库无法访问的东西,因为信息存储在内存中。

然而,内存中的数据可以像其他查询一样传输到SQL Server。Contains应该翻译为IN。 - greenoldman

1
由于m.collection2已经在数据库中,请勿使用Contains。请使用Any。
m.collection2.Any(x => x == s)

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接