簡體   English   中英

EntityFramework6 / Npgsql:如何將orderBy的null轉換為SQL查詢

[英]EntityFramework6 / Npgsql: how to translate orderBy nulls last into SQL query

我正在使用EntityFramework6.Npgsql,並且正在處理具有數百萬條記錄的表。 一些實體具有timestamp / DateTime列,該列允許使用null值。 用戶通常需要在此列上進行排序,並且希望在ascdesc排序中最后顯示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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM