[英]EntityFramework6 / Npgsql: how to translate orderBy nulls last into SQL query
我正在使用EntityFramework6.Npgsql,並且正在處理具有數百萬條記錄的表。 一些實體具有timestamp
/ DateTime
列,該列允許使用null
值。 用戶通常需要在此列上進行排序,並且希望在asc
和desc
排序中最后顯示null
值。 該列針對這兩種排序類型都有兩個indizes,它們都設置為nulls last
我知道在SQL中我可以order by "DateColumn" desc nulls last
來添加order by "DateColumn" desc nulls last
而postgres使用適當的索引,並且查詢在幾毫秒內返回(分頁,例如25條記錄)結果。
但是,使用EntityFramework時,為了最后對null進行降序排序,我必須添加以下內容:
entities.MyEntity
.OrderByDescending(e => e.DateColumn.HasValue)
.ThenByDescending(e => e.DateColumn)
但是,這會轉換為包含以下內容進行排序的查詢:
SELECT
CASE
WHEN ("Extent1"."DateColumn" IS NOT NULL) THEN (TRUE)
ELSE (FALSE)
END AS "C1"
...
ORDER BY "C1", "DateColumn" DESC
它可以按預期工作,但是由於無法使用索引,因此查詢需要花費幾秒鍾(而不是幾毫秒)的時間來執行。
我嘗試使用相同的表達式向列添加索引,但是在執行查詢時,postgres似乎不使用索引。
我必須在EntityFramework / Npgsql中寫一個可以轉換為所需SQL的查詢的選項( order by "DateColumn" desc nulls last
)? 有沒有辦法攔截/覆蓋如何將Linq查詢轉換為SQL?
回答我自己的問題...
雖然仍然無法使Linq生成一個SQL查詢,該查詢nulls last
使用nulls last
進行排序,但我仍然能夠為null-check和date列本身創建一個組合索引,該索引已被postgres使用:
CREATE INDEX "MyTable_IX_DateCombined"
ON "MyTable"
USING btree
((
CASE
WHEN "DateColumn" IS NOT NULL THEN true
ELSE false
END) DESC, "DateColumn" DESC);
由於在任何一種情況下都必須創建一個額外的索引,因此我認為此解決方案目前足夠好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.