Mark Seeman氏が “IQueryable is Tight Coupling”と題した記事でIQueryable<T>を継承するインターフェイスを持ったAPIを設計するのは、いくつかの理由で良くないと指摘している。
Why?
..IQueryable<T>は.NETが提供する代表的なヘッダーインタフェースで、完全に実装するのは不可能です。
したがって、メソッドが確実にIQueryableインターフェイスを完全に実装したオブジェクトを返すとは想定できない。
このインターフェイスは柔軟で表現が複雑でひとつの例外しか持たないため、インターフェイスの提供側が解釈できないクエリを書くことができてしまいます。
IQueryable<T>を完全に実装しているのは、インメモリの実装だけです。
Mark氏によれば、このインターフェイスは漏れが起きやすい。というのは多くの場合、IQueryableが実装されるのは、コード内のデータストアのプロバイダだからだ。
この主張は完全に正しいように思える。考慮すべき点は漏れが起きやすいインターフェイスにはどんな問題があるのか、ということだ。漏れが起きやすいインターフェイスでも、最低限、耐えられる程度にはコードをシンプルにしてくれるのではないか。
例えば、ASP.NET Web APIはIQueryableを返す場合、リクエストのパラメータを使って、取得するデータのフィルタリングができる。同様に、WCF RIA ServicesのDomainContextメソッドはIQueryableを返すので、クライアントはXAMLのフィルタディスクリプタを使って、または、JQueryクライアントから要求することで必要なデータのみ取り出すことができる。
読者はどのようにお考えだろうか。