1

我有一个 cust,IQueryable一个Customercust,一个CustomerComparercustCp,它实现了IEqualityComparer.

当我打电话时,custs.Contains(cust, custCp)我得到一个例外:

System.NotSupportedException: Unsupported overload used for query operator 'Contains'

但是当我打电话给custs.AsEnumerable().Contains(cust,custCp)它时。谁能解释为什么?

4

2 回答 2

3

对 an 的操作IQueryable(在 Linq to Entities 的情况下)被转换为 SQL 并在数据库中执行。由于您使用IEqualityComparerC# 编写,因此无法将比较器转换为 SQL,并且无法支持重载。

当你把它翻译成IEnumerableusingAsEnumerable()时,所有的数据都会从数据库传输到内存中,在那里可以很容易地支持重载。当然,缺点是您传输的数据比必要的多(可能是整个表)以使其在内存中过滤。

于 2013-03-15T13:54:42.380 回答
1

IQueryable由查询提供程序实现,并在后台转换为目标系统可以理解的内容。例如,IQueryable.Contains可能会被转换为x IN ySQL 表达式。

另一方面,IEnumerable不是这样翻译的。它Contains适用于任何IEnumerable正确实施的东西。

使用IQueryable运算符是在服务器端执行的,因此在远程执行查询时会为您带来一些性能,而IEnumerable在本地(客户端)执行。这意味着,如果您要获取一个数据库表,将其转换为可枚举的然后应用Contains到它上面,则需要将整个表下载到您的计算机以进行枚举。

于 2013-03-15T13:53:30.213 回答