LINQ to SQL: "Method 'Boolean Contains(System.Strin

本文关键字:Contains Boolean System Strin Method to quot LINQ SQL | 更新日期: 2023-09-27 18:05:02

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

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

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

我有这一行来获取差异:

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

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

方法'Boolean Contains(System.String)'不支持转换为SQL。

是否有解决这个问题的方法?显然,我可以遍历两个列表,但我要追求最佳性能。

LINQ to SQL: "Method 'Boolean Contains(System.Strin

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

@Rob在评论中提供了一个很好的解释,为什么Contains可以在IEnumerable上工作,但不能在HashSet上工作:

可以工作,因为Contains是on的特定实现HashSet。在转换为SQL时,它有一组支持的方法,包括Queryable.Contains()——这是一个不同的方法从你写的东西来看。HashSet。Contains有不同的实现(即,对值进行散列并进行查找),以及不能转换为SQL

将moviesOnDisk更改为array,它将工作。
数组项的类型必须与TMDbId

相同