1. 程式人生 > >IQueryable和IEnumerable

IQueryable和IEnumerable

pro file 查看 info joins task UNC image ==

使用EF你必須知道這兩個的區別,可以幫助我們的提升性能。

表達樹:Linq 表達

IQueryable和IEnumerable

IQueryable

延時執行;擴展方法接受的是Expression(必須要能轉成sql,否則報錯)

IEnumerable

延時執行;擴展方法接受的是Func(C#語法)

②AsEnumerable() 和 ToList() 的區別

ToList()

立即執行,加載數據到內存中。

AsEnumerable()

延遲執行,真正使用時才加載數據。對IQueryable對象使用AsEnumerable()後,仍然是延遲執行

IQueryable繼承自IEnumerable,所以對於數據遍歷來說,它們沒有區別。

1.IEnumerable查詢必須在本地執行.並且執行查詢前我們必須把所有的數據加載到本地.而且更多的時候.加載的數據有大量的數據是我們不需要的無效數據.但是我們卻不得不傳輸更多的數據.做更多的無用功

使用IEnumerable,所有對於IEnumerable的過濾,排序等操作,都是在內存中發生的。也就是說數據已經從數據庫中獲取到了內存中,只是在內存中進行過濾和排序操作。

2.IQueryable卻總能只提供你所需要的數 據.大大減少了數據的傳輸

IQueryable的優勢是它有表達式樹,所有對於IQueryable的過濾,排序等操作,都會先緩存到表達式樹中,只有當真正遍歷發生的時候,才會將表達式樹由IQueryProvider執行獲取數據操作。

註:foreach針對的是數據集整體對象(枚舉器?)。當使用foreach時,不管是iq對象還是ie對象,它們都是查詢數據庫一次,然後開始循環,直至循環結束。不過,當後續再次使用iq對象或ie對象的具體數據時,它們仍然會再次查詢數據庫。

列如:

    [HttpGet]
        public async Task<IHttpActionResult> Init3()
        {
            IQueryable<JoinA> joins = db.JoinAs.Where(x => x.ACode == "004"
); var joins2 = joins.Where(x=>x.AName.Contains("測試")); foreach (var item in joins2) { Console.WriteLine(item.Id); } IEnumerable<JoinA> joinsE = db.JoinAs.Where(x => x.ACode == "004").AsEnumerable(); var joinsE2 = joinsE.Where(x => x.AName.Contains("測試")); foreach (var item in joinsE2) { Console.WriteLine(item.Id); } return await Task.FromResult(Ok("")); }

SQL Server Profiler工具 查看我們的sql語句

IQueryable:會拼接我們的sql,最後執行

技術分享圖片

IEnumerable:先查詢到內存中,然後進行操作

技術分享圖片

SQL Server Profiler工具: https://www.cnblogs.com/kissdodog/p/3398523.html

IQueryable和IEnumerable