通常,使用linq查詢時需要一個實現IQueryable<T> 的查詢對象
public class DataA<T> : IQueryable<T> {....}
之後通過
var q = from c in new DataA<int>() where c > 0 select new { a = c.ToString() };
進行查詢,使用IQueryProvider 收集用戶輸入的表達式進行處理。
但是查詢本身實際上只關注查詢對象上有無可用的 linqmethod(Select,Where.....).
如下,定義一個泛型對象
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...),
我們依然可以使用相同的 linq 語法進行查詢:
var q = from c in new Data<int>() where c > 0 select new { a = c.ToString() };
結論: linq 查詢語法與查詢對象的類型無關,只會檢查查詢對象上有無名稱、方法簽名一致的方法(實例方法或擴展方法)。
IQueryable,IQueryProvider 在linq查詢中不是必須的。
順便說一下 ,個人認為, orm中最好不要使用IQueryable 這些,容易造成方法污染, 而且linq查詢語法是固定的,無法擴展或限制。
Orm中最好直接使用 各種查詢方法,更加靈活一些。