簡體   English   中英

如何按實體框架/Linq 中的連接值排序?

[英]How to order by concatenated values in Entity Framework / Linq?

我有一種情況,父表 (Record) 中的記錄可以在子表 (PhysicalPerson 和 Company) 中具有兩個相關記錄之一。 其中一列將始終為空。

在 UI 網格中顯示記錄時,用戶應該只看到 OwnerName 列中的兩個名稱之一,並且用戶應該能夠在不知道任何記錄的 OwnerName 來自 Company 或 PhysicalPerson 的情況下對列 OwnerName 進行排序。

為了避免非規范化數據以及復制和維護 Name 列,我嘗試在 Linq 查詢中完成所有操作。

基本上,所需的 SQL order by expression 應該如下所示:

ORDER BY CONCAT(Record.PhysicalPerson.Name,
Record.PhysicalPerson.Surname,
Record.Company.Name)

這將自動忽略 NULL 值,結果看起來可以接受。

所以我嘗試在 Linq 中實現它:

query = query.OrderBy(x => x.PhysicalPerson.Name + 
                                        x.PhysicalPerson.Surname +
                                        x.Company.Name);

但實體框架生成的查詢結果如下所示:

[Extent4].[Name] + [Extent6].[Surname] + [Extent8].[Name] AS [C1]
...
ORDER BY [Project1].[C1] ASC
...

顯然,+ 不能替代 SQL 中的 CONCAT。

有沒有辦法讓EntityFramework在OrderBy中生成CONCAT而不是+用於字符串連接?

如果沒有,那么我想我將不得不為這個特定的 UI 網格創建一個帶有計算列的單獨 SQL 視圖(無論如何這可能是更正確的解決方案)。

嘗試這個:

query = query.OrderBy(x => x.PhysicalPerson.Name).ThenBy(x.PhysicalPerson.Surname).ThenBy(x.Company.Name);

不幸的是,SQL/EF 的 LINQ 翻譯器不使用CONCAT來翻譯字符串連接,這與其他翻譯期望 SQL 自動處理 null 的方式不一致(或者,與CONCAT不同的+的 SQL 定義可能是問題所在) . 在任何情況下,您都可以像這樣使空測試顯式:

query = query.OrderBy(x => String.Concat(x.PhysicalPerson.Name ?? "", x.PhysicalPerson.Surname ?? "", x.Company.Name ?? ""));

您也可以使用+代替String.Concat ,但我認為使用String.Concat更容易看出String.Concat

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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