我有一个表示tmdbId的字符串集,用于磁盘上的电影,名为moviesOnDisk。
我有一个电影对象的数据库,并在tmdbId
上建立索引。
我想删除数据库中存在但磁盘上不存在的记录。
我要用这句话来区别一下:
var toDelete = Database.Movies.Where(x => !moviesOnDisk.Contains(x.TMDbId));
这没有给我任何结果,以下信息如下:
方法‘布尔包含(System.String)’不支持转换到SQL。
这附近有工作吗?显然,我可以迭代这两个列表,但我将追求最好的性能。
发布于 2015-07-26 18:11:10
将where子句更改为!moviesOnDisk.ToList().Contains(x.TMDbId)
。
@Rob在评论中给出了一个很好的解释,为什么Contains
将在IEnumerable
上工作,而不是在HashSet
上工作
它之所以有效,是因为Contains是HashSet上的一个特定实现。在转换到SQL时,它有一组受支持的方法,包括Queryable.Contains() --这是一种与您编写的方法不同的方法。HashSet.Contains有一个不同的实现(即哈希值并执行查找),并且不能转换为SQL。
发布于 2015-07-26 17:59:51
将moviesOnDisk更改为数组,它将工作。
数组项的类型必须与TMDbId相同
https://stackoverflow.com/questions/31643871
复制