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)