LINQ 查詢注意事項
- 2010-03-07
- 13456
- 0
LINQ 是一個相當方便的查詢語法,但也因為太方便很多該注意到的事情就很容易忽略,最近 demo 的案子網站流量相當的大,所以所有可以優化的部份都需要注意,因此才會開始計較這一點點的差異,不過如果養成了習慣,相信以後寫出來的網站效能是會相對的提升的。
在開發的過程中,一定經常會遇到需要先檢查資料在不在才決定是否要繼續下一步的情境,在 LINQ 我們就可能很直覺的寫出:
Products.Where(p=>p.CategoryID==1).FirstOrDefault();
這樣的查詢字串,沒錯資料一樣出的來,但是LINQ將他轉成 SQL 語法的時候 會變成很沒有效率的這副德性
SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued] FROM [Products] AS [t0] WHERE [t0].[CategoryID] = @p0
因為需求只是檢查有沒有該筆資料重點會落在 where 指令,而不是找到什麼,在以往用 ADO.NET 的時候因為 SQL 是自己下的,所以應該都會注意這些細節,但是 LINQ 沒有很直接的方式可以看到轉出什麼樣的 SQL 指令,所以很容易忽略這部份, demo 的習慣都是使用 LINQ Pad 這套工具去跑一跑,簡單的看一下到底查詢出什麼,用上面的例子來說正確的 LINQ 應該下這樣。
Products.Where(p=>p.CategoryID==1) .Select(p=>p.ProductID) .FirstOrDefault()
明確的告訴他只要找一個欄位,至於是什麼欄位就沒差別了。
建議不要查有預設值的比如 GUID 因為沒有又不能 null 就會變成 00000000-0000-0000-0000-000000000000
最後再附上兩張圖,簡單的說明兩種寫法的執行效率
回應討論