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。
是否有解决这个问题的方法?显然,我可以遍历两个列表,但我要追求最佳性能。
将where子句更改为!moviesOnDisk.ToList().Contains(x.TMDbId)
。
@Rob在评论中提供了一个很好的解释,为什么Contains
可以在IEnumerable
上工作,但不能在HashSet
上工作:
可以工作,因为Contains是on的特定实现HashSet。在转换为SQL时,它有一组支持的方法,包括Queryable.Contains()——这是一个不同的方法从你写的东西来看。HashSet。Contains有不同的实现(即,对值进行散列并进行查找),以及不能转换为SQL
将moviesOnDisk更改为array,它将工作。
数组项的类型必须与TMDbId