Linqクエリーとメソッド呼び出し

1332 ワード


通常、linqクエリを使用するには、IQueryableを実装するクエリオブジェクトが必要です.
 public class DataA : IQueryable {....}

  
あとで通過
 var q = from c in new DataA() where c > 0 select new { a = c.ToString() };

クエリー、IQueryProviderの使用  ユーザーが入力した式を収集して処理します.
しかし、クエリ自体は、クエリオブジェクトに使用可能なlinqmethodがあるかどうかのみに注目する.
次のように、汎用オブジェクトを定義します.
public class Data {
        public Data Select< TResult>(   Expression> selector) {
            return new Data();
        }
        public Data Where (  Expression> f) {
            return this;
        }
    }

データにlinqメソッドと同じインスタンスメソッドがあることを保証する限り、(Select,Where...)、
同じlinq構文を使用してクエリーを行うこともできます.
var q = from c in new Data() where c > 0 select new { a = c.ToString() };

 結論:linqクエリー構文はクエリー・オブジェクトのタイプに関係なく、クエリー・オブジェクトに名前、メソッド署名が一致するメソッド(インスタンス・メソッドまたは拡張メソッド)があるかどうかを確認します.
IQueryProviderはlinqクエリでは必須ではありません.
ちなみに、個人的には、ormではIQueryableなどを使わないほうがいいと思います.方法が汚染されやすく、linqクエリの文法が固定されていて、拡張や制限ができません.
Ormでは、様々なクエリー・メソッドを直接使用し、より柔軟にすることが望ましい.