11三月/120
Linq 多欄位 OrderBy 在不同 Framework 轉譯後 SQL 差異
前言
自從微軟推出 Linq 之後就很少在直接下 SQL 語法了,雖然 Linq 很方便,但是還是得多嘗試去看轉換後的 SQL 才可以避免結果和預期不一樣或是產出效能不好的 SQL ,今天要介紹的就是多欄位 OrderBy 在 Linq to SQL 和 linq to Entity 上差異的問題。
說明
首先準備好兩個資料來源,這邊我就直接利用 LinqPad 囉!
首先來看我們要測試的語法
1 2 3 4 |
from p in Test orderby p.starttime orderby p.endtime select p |
上面的語法看似正常,但是我們來看分別轉換後的 SQL
Linq to SQL
1 2 3 |
SELECT [t0].[id] AS [Id], [t0].[starttime] AS [Starttime], [t0].[endtime] AS [Endtime] FROM [Test] AS [t0] ORDER BY [t0].[endtime], [t0].[starttime] |
Linq to Entity
1 2 3 4 5 6 |
SELECT [Extent1].[id] AS [id], [Extent1].[starttime] AS [starttime], [Extent1].[endtime] AS [endtime] FROM [dbo].[Test] AS [Extent1] ORDER BY [Extent1].[endtime] ASC |
可以發現兩個問題:
- Linq to SQL 在排序的順序上面,和我們所下的順序是剛好相反的,先 endtime 才 starttime
- Linq to Entity 只有排序最後下的欄位 endtime 而已
這邊得注意在使用上會有這樣的問題,而改換成下面的 Landa Expression 也是一樣的結果。
1 |
Test.OrderBy(X=>X.starttime).OrderBy(X=>X.endtime).Select(X=>X) |
如果要多條件的排序建議還是使用下面的語法來查詢囉!
1 2 3 |
from p in Test orderby p.starttime, p.endtime select p |
或
1 |
Test.OrderBy(X=>X.starttime).ThenBy(X=>X.endtime).Select(X=>X) |
這樣就可以產生如我們想像的 SQL 語法了
1 2 3 4 5 6 |
SELECT [Extent1].[id] AS [id], [Extent1].[starttime] AS [starttime], [Extent1].[endtime] AS [endtime] FROM [dbo].[Test] AS [Extent1] ORDER BY [Extent1].[starttime] ASC, [Extent1].[endtime] ASC |
結論
這又是一次的魔鬼藏在細節中啊!在使用 Linq 的時候,有時候還是得去看看它所轉譯出的 SQL 語法,避免未來程式上會有效能或是邏輯上的問題,希望這次的分享對大家有幫助啦!
Leave a comment