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では、様々なクエリー・メソッドを直接使用し、より柔軟にすることが望ましい.