方法';布尔包含(System.String)和#x27;没有支持的到SQL的转换

方法';布尔包含(System.String)和#x27;没有支持的到SQL的转换,sql,linq-to-sql,Sql,Linq To Sql,方法“Boolean Contains(System.String)”不支持转换为SQL 查询是可查询的,但已停止工作: foreach (string s in collection1) { if (s.Length > 0) { query = query.Where(m => m.collection2.Contains(s)); } } 更新:当我将查询设

方法“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而不是通过循环迭代获得相同结果的方法是什么?

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

从stackoverflow看一下

结果查询似乎需要访问数据库中包含的内容
无法访问,因为信息在内存中。

因为m.collection2在数据库中,所以不要使用Contains。使用任何

m.collection2.Any(x => x == s)
试试这个:

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

你能在查询进入这个循环之前发布它是什么吗?使用纯LINQ不会改变任何事情——它也有同样的问题。由于未知原因,如果LINQ检测到“奇怪”集合为哈希集,而不是将其用作IEnumerable,则用户必须将其集合直接转换为IEnumerable——然后CONTAINS被正确转换为SQL(在我的假设中)。不过,内存中的数据可以像任何其他查询一样传输到SQL Server。Contains应转换为IN.+1-似乎要让LINQ to SQL生成SQL“IN”子句,集合的编译时类型必须是列表。在我的测试中,我有一个List实例,但查询将其视为IList,我得到了问题中提到的错误。但是,确保查询在编译时将其视为列表可以修复它。