我有一个字符串的哈希集,表示我在磁盘上的电影的tmdbId - 名为moviesOnDisk。
我有一个电影对象数据库,在tmdbId
索引。
我想删除数据库中存在但磁盘上不存在的记录。
我有这条线来解决差异:
var toDelete = Database.Movies.Where(x => !moviesOnDisk.Contains(x.TMDbId));
这给了我没有结果和以下信息:
方法'Boolean Contains(System.String)'没有支持的SQL转换。
有解决方法吗?显然我可以迭代这两个列表,但我的目标是最好的。
答案 0 :(得分:4)
将您的where子句更改为!moviesOnDisk.ToList().Contains(x.TMDbId)
。
@Rob在评论中提供了一个很好的解释,说明为什么Contains
将对IEnumerable
起作用,而不是HashSet
:
它的工作原理是因为Contains是一个特定的实现 HashSet的。转换为SQL时,它有一组受支持的 方法,包括Queryable.Contains() - 这是一个不同的方法 从你所写的。 HashSet.Contains有不同的 实现(即散列值并进行查找),以及 无法转换为SQL
答案 1 :(得分:-1)
将moviesOnDisk更改为数组,它将起作用 数组项的类型必须与TMDbId
相同