在 LINQ-SQL 中,aContains
将转换为 aSELECT ... WHERE field IN(...)
并且应该相对较快。然而,在 LINQ-Objects 中,ICollection<T>.Contains
如果源是ICollection<T>
.
当 LINQ-SQL 结果被视为 anIEnumerable
而不是 时IQueryable
,您将丢失 linq 提供程序 - 即,任何进一步的操作都将在内存中而不是在数据库中完成。
至于为什么它的内存慢得多:
Array.Contains()
是一个 O(n) 操作所以
something.Where(s => previousarray.Contains(s.field));
是 O(p * s),其中p是 的大小,previousarray
s是的大小something
。
HashSet<T>.Contains()
另一方面是 O(1) 操作。如果你首先创建一个哈希集,你会看到操作上有很大的改进,.Contains
因为它将是 O(s) 而不是 O(p * s)。
例子:
var previousSet = new HashSet<int>(previousarray);
var result = something.Where(s => previousSet.Contains(s.field));