日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IEnumerable和IQueryable的区别

發(fā)布時間:2023/12/20 编程问答 77 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IEnumerable和IQueryable的区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??

?

?IEnumerable<T>在.Net2.0中我們已經(jīng)很熟悉了.你想要利用Foreach迭代嗎?實現(xiàn) IEnumerable<T>吧!你想直接做為數(shù)據(jù)源綁定到控件嗎?使用IEnumerable吧!是的.只要是序列.它都實現(xiàn)了 IEnumerable<T>(.Net1.0下的序列類除外).除了這些.LINQ的出現(xiàn).還賦予了 IEnumerable<T>更強悍的功能.IQueryable<T>繼承IEnumerable<T>.詳細看 IEnumerable<T>和IQueryable<T>這兩個API的簽名.可以說非常相似.從某種意義上來說.它們是可以 互換的.但是卻不總是可以互相代替的.IEnumerable<T>和IQueryable<T>的行為有所不同.其性能方面也 可能天差地別.例如:

var q = from c in dbContext.Customers
where c.City == "shenzhen"
select c;
var q = (from c in dbContext.Customers
where c.City == "shenzhen"
select c).AsEnumerable();

這兩個查詢看起來幾乎一模一樣.查詢返回的結(jié)果也一樣.但他們的實現(xiàn)方式卻大相徑庭.第一個查詢使用了LINQ2SQL的處理方式.第二個查詢則使 用了LINQ2Object處理.通過前面的學習.我們知道,LINQ2Object的處理結(jié)果是把LINQ表達式映射成對應的委托,而LINQ2SQL 則是保存了一系列的"步驟"---表達式樹的處理方式.兩者的區(qū)別簡單的理解就是LINQ2Object將數(shù)據(jù)存放在內(nèi)存中.而LINQ2SQL則是把數(shù) 據(jù)存放在遠程的服務器中.

場景模擬

?????? 舉一個例子.現(xiàn)在有兩個水果批發(fā)商A,B..A除了是批發(fā)商,自己還承包了幾個果場.自產(chǎn)自銷.B和幾個大型的果場合作.只做批發(fā)工作.每次客人來A訂 貨.指定要什么貨物,A就可以立刻拿出.速度快.服務佳.缺點是由于是自己的果場.那量肯定不大,而且品種不齊全,小作坊式的經(jīng)營.B呢?每次客戶訂 單.B是先把客戶需要的貨物規(guī)格等記錄下來.一次性去各個果場取貨.這樣B的優(yōu)點就是量大.品種多.但速度可能偏慢(收到貨的時間).不過若B以A的銷售 方式來銷售.那么B的效績肯定是讓人十分不滿意,工廠式的經(jīng)營.

???????? 總結(jié)之,IEnumerable<T>查詢必須在本地執(zhí)行.并且執(zhí)行查詢前我們必須把所有的數(shù)據(jù)加載到本地.而且更多的時候.加載的數(shù)據(jù)有大 量的數(shù)據(jù)是我們不需要的無效數(shù)據(jù).但是我們卻不得不傳輸更多的數(shù)據(jù).做更多的無用功.而IQueryable<T>卻總能只提供你所需要的數(shù) 據(jù).大大減少了數(shù)據(jù)的傳輸.這就好比我們在小作坊下訂單.小作坊老板跟我們說.他的貨剛好比你所需要的多出一些.你只能要了它.不然剩下一點他不好賣等 等.而大工廠卻不會出現(xiàn)這種狀況.

個性要求

雖說小作坊很多弊病.但有時候卻有著大工廠無法媲美的服務.假如你需要一種八種水果組合套餐.大工廠一般不會為你量身定做.單對單服務.相反.小作坊客源有限.一般都會滿足你的個人需求.

場景切換:在<<[More Effective C#]Lambda表達式優(yōu)化>>里我們提到過.LINQ2SQL中是不允許出現(xiàn)自定義方法的.這是由于LINQ2SQL的處理方式.詳見<<[More Effective C#]Lambda表達式優(yōu)化>>.而LINQ2Object卻能很好的滿足我們自定義方法這個性化的要求.

但是.除了自定義方法.還有一些內(nèi)置的方法IEnumerable<T>和IQueryable<T>是同時支持的.例如常見的string類的操作方法.substring,indexof等等.

?

IQueryable繼承自IEnumerable,所以對于數(shù)據(jù)遍歷來說,它們沒有區(qū)別。

1.IEnumerable查詢必須在本地執(zhí)行.并且執(zhí)行查詢前我們必須把所有的數(shù)據(jù)加載到本地.而且更多的時候.加載的數(shù)據(jù)有大量的數(shù)據(jù)是我們不需要的無效數(shù)據(jù).但是我們卻不得不傳輸更多的數(shù)據(jù).做更多的無用功。
使用IEnumerable,所有對于IEnumerable的過濾,排序等操作,都是在內(nèi)存中發(fā)生的。也就是說數(shù)據(jù)已經(jīng)從數(shù)據(jù)庫中獲取到了內(nèi)存中,只是在內(nèi)存中進行過濾和排序操作。

2.IQueryable卻總能只提供你所需要的數(shù) 據(jù).大大減少了數(shù)據(jù)的傳輸
IQueryable的優(yōu)勢是它有表達式樹,所有對于IQueryable的過濾,排序等操作,都會先緩存到表達式樹中,只有當真正遍歷發(fā)生的時候,才會將表達式樹由IQueryProvider執(zhí)行獲取數(shù)據(jù)操作。

尾聲

????? 可能這個例子在這里有些牽強.但相信IEnumerable<T>和IQueryable<T>之間的區(qū)別不難理解.更多時候我 們在查詢序列的時候.要考慮到底是本地查詢好.還是遠程查詢好.至于哪種查詢更好.沒有絕對的說法.適合應用環(huán)境,已經(jīng)能發(fā)揮最大效應的.那就是最好的.

?IEnumerable<T> 是小作坊做法,因為它把數(shù)據(jù)加載到本地后才做過濾操作,

IEnumerable<T>?數(shù)據(jù)已加載到內(nèi)存

IQueryable<T> 是工廠模式,按需訂購.在實際場景中, 工作模式的場景還是比較多的.?

IQueryable<T>?此時為表達式,待ToList的時候加載到內(nèi)存?

轉(zhuǎn)自:http://www.dotblogs.com.tw/kongyiyun/archive/2010/10/22/18510.aspx

轉(zhuǎn)載于:https://www.cnblogs.com/383855647chenyu/p/5110520.html

總結(jié)

以上是生活随笔為你收集整理的IEnumerable和IQueryable的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。