Entity Framework快速入門--IQueryable與IEnumberable的區別(轉載)

IEnumerable接口html

公開枚舉器,該枚舉器支持在指定類型的集合上進行簡單迭代。也就是說:實現了此接口的object,就能夠直接使用foreach遍歷此object;sql

IQueryable 接口數據庫

它繼承 IEnumerable 接口,而由於.net版本加入Linq和IQueryable後,使得IEnumerable再也不那麼單調,變得更增強大和豐富。服務器

爲了區別兩個接口,咱們經過一個實際的例子來解釋一下。spa

根據上篇隨筆的實例,編寫以下代碼:.net

static void Main(string[] args)
        {
            //建立數據庫訪問網關
            using (SchoolDBEntities schoolEntities = new SchoolDBEntities())
            {
                //查詢的結果放入IQueryable接口的集合中
                IQueryable<T_Class> classesIQue = (from c in schoolEntities.T_Class
                                                   orderby c.ID
                                                     select c).Skip<T_Class>(3).Take<T_Class>(3);
                //注意這個AsEnumerable<T_Class>()在分頁查詢以前,先將其轉換成IEnumerable類型
                IEnumerable<T_Class> classesIEnu = (from c in schoolEntities.T_Class
                                                    orderby c.ID   
                                                    select c).AsEnumerable<T_Class>().Skip<T_Class>(3).Take<T_Class>(3);
                //由於啓用了延遲加載機制,因此下面調用一下,纔會真正去讀取數據庫
                int i = 0;
                foreach (var c in classesIQue)
                {
                    i++;
                }
                Console.WriteLine(i);
                foreach (var c in classesIEnu)
                {
                    i++;
                }
                Console.WriteLine(i);
            }
            Console.WriteLine("OK");
            Console.ReadKey();
        }

注意紅色代碼部分,在用linq查詢實體集合以前我先將其轉換成 IEnumerable接口類型,看看最終執行的sql是怎樣的。翻譯

第一種:直接返回 IQueryable類型的查詢,以下圖所示:code

第二種:在用分頁查詢以前先將其轉換成 IEnumerable實際執行的sql以下圖所示:htm

總結blog

IQueryable接口與IEnumberable接口的區別:  IEnumerable<T> 泛型類在調用本身的SKip 和 Take 等擴展方法以前數據就已經加載在本地內存裏了,而IQueryable<T> 是將Skip ,take 這些方法表達式翻譯成T-SQL語句以後再向SQL服務器發送命令,它並非把全部數據都加載到內存裏來才進行條件過濾。

 

原文連接http://www.cnblogs.com/fly_dragon/archive/2011/02/21/1959933.html

相關文章
相關標籤/搜索