LINQ to SQL:“方法”布尔包含(System.String)'没有支持的SQL转换。“

时间:2015-07-27 01:48:18

标签: c# sql-server linq

我有一个字符串的哈希集,表示我在磁盘上的电影的tmdbId - 名为moviesOnDisk。

我有一个电影对象数据库,在tmdbId索引。

我想删除数据库中存在但磁盘上不存在的记录。

我有这条线来解决差异:

var toDelete = Database.Movies.Where(x => !moviesOnDisk.Contains(x.TMDbId));

这给了我没有结果和以下信息:

  

方法'Boolean Contains(System.String)'没有支持的SQL转换。

有解决方法吗?显然我可以迭代这两个列表,但我的目标是最好的。

2 个答案:

答案 0 :(得分:4)

将您的where子句更改为!moviesOnDisk.ToList().Contains(x.TMDbId)

@Rob在评论中提供了一个很好的解释,说明为什么Contains将对IEnumerable起作用,而不是HashSet

  

它的工作原理是因为Contains是一个特定的实现   HashSet的。转换为SQL时,它有一组受支持的   方法,包括Queryable.Contains() - 这是一个不同的方法   从你所写的。 HashSet.Contains有不同的   实现(即散列值并进行查找),以及   无法转换为SQL

答案 1 :(得分:-1)

将moviesOnDisk更改为数组,它将起作用 数组项的类型必须与TMDbId

相同