一般,使用linq查詢時須要一個實現IQueryable<T> 的查詢對象ide
public class DataA<T> : IQueryable<T> {....}
以後經過this
var q = from c in new DataA<int>() where c > 0 select new { a = c.ToString() };
進行查詢,使用IQueryProvider 收集用戶輸入的表達式進行處理。orm
可是查詢自己實際上只關注查詢對象上有無可用的 linqmethod(Select,Where.....).對象
以下,定義一個泛型對象blog
public class Data<T> { public Data<TResult> Select< TResult>( Expression<Func<T, TResult>> selector) { return new Data<TResult>(); } public Data<T> Where ( Expression<Func<T,bool>> f) { return this; } }
只要保證Data上擁有與linq方法相同的實例方法,(Select,Where...),io
咱們依然能夠使用相同的 linq 語法進行查詢:class
var q = from c in new Data<int>() where c > 0 select new { a = c.ToString() };
結論: linq 查詢語法與查詢對象的類型無關,只會檢查查詢對象上有無名稱、方法簽名一致的方法(實例方法或擴展方法)。泛型
IQueryable,IQueryProvider 在linq查詢中不是必須的。擴展
順便說一下 ,我的認爲, orm中最好不要使用IQueryable 這些,容易形成方法污染, 並且linq查詢語法是固定的,沒法擴展或限制。select
Orm中最好直接使用 各類查詢方法,更加靈活一些。