一般,使用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中最好直接使用 各类查询方法,更加灵活一些。