Linq 查詢 與方法調用

 

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

相關文章
相關標籤/搜索