IQueryable & IEnumberable 區別

Namespace And Inheritances Relations

                  


?
1
2
3
4
5
6
7
8
9
Namespace: System.Collections
    [ComVisibleAttribute(true)]
    [GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
    public interface IEnumerable
Namespace: System.Collections.Generic
    public interface IEnumerable : IEnumerable
Namespace: System.Linq
    public interface IQueryable : IEnumerable
    public interface IQueryable : IEnumerable, IQueryable, IEnumerable
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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();
        }

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

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

總結

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

(轉載自:FlyDragon)

發佈了14 篇原創文章 · 獲贊 23 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章