1

私はIQueryablecusts、cust、を実装CustomerするcustCpを持っています。CustomerComparerIEqualityComparer

電話をかけるcusts.Contains(cust, custCp)と、例外が発生します。

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

しかし、私がそれを呼ぶとき、custs.AsEnumerable().Contains(cust,custCp)それはうまくいきます。誰かが理由を説明できますか?

4

2 に答える 2

3

IQueryable(Linq to Entitiesの場合)に対する操作はSQLに変換され、データベースで実行されます。C#で記述されているためIEqualityComparer、比較プログラムをSQLに変換できず、オーバーロードをサポートできません。

IEnumerableこれをusingに変換するとAsEnumerable()、すべてのデータがデータベースからメモリに転送され、過負荷を簡単にサポートできます。もちろん、欠点は、メモリでフィルタリングするために必要以上のデータ(場合によってはテーブル全体)を転送していることです。

于 2013-03-15T13:54:42.380 に答える
1

IQueryableクエリプロバイダーによって実装され、内部でターゲットシステムが理解できるものに変換されます。たとえば、 SQL式IQueryable.Containsに変換される場合があります。x IN y

一方、IEnumerableそのように翻訳されていません。適切Containsに実装されているものなら何でも動作しIEnumerableます。

演算子の使用はサーバー側で実行されるため、クエリがリモートで実行されるのに対し、ローカル(クライアント側)で実行IQueryableされるため、パフォーマンスが向上します。IEnumerableつまり、データベーステーブルを取得し、それを列挙可能に変換してから適用Containsする場合は、テーブル全体をコンピュータにダウンロードして列挙する必要があります。

于 2013-03-15T13:53:30.213 に答える