簡體   English   中英

訂購Nullable <int> 在Entity Framework中使用默認值

[英]OrderBy on a Nullable<int> with a default value in Entity Framework

我們正在遷移一些代碼以使用Entity Framework並且有一個嘗試對Nullable字段進行排序的查詢,並提供一個默認排序值,使用Nullable.GetValueOrDefault(T)函數將值設置為null。

但是,執行時它會返回以下錯誤:

LINQ to Entities無法識別方法'Int32 GetValueOrDefault(Int32)'方法,並且此方法無法轉換為存儲表達式。

查詢看起來像:

int magicDefaultSortValue = 250;
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn
                                          .GetValueOrDefault(magicDefaultSortValue));

這個答案我可以看到有一種方法可以在您的EDMX中提供“翻譯” 我們可以為這個合並函數編寫類似的翻譯嗎?

注意:當我嘗試時, ?? 在查詢中合並運算符而不是GetValueOrDefault它確實有效。 那么也許是什么使得這項工作可以被利用?

我相信你找到了答案。 當你使用?? ,EF使用CASE生成SQL,如果值為null ,則選擇排序值,然后對其進行排序。

MyTable.OrderBy (t => t.MyNullableSortColumn ?? magicDefaultSortValue).ToArray();

將生成以下sql:

-- Region Parameters
DECLARE p__linq__0 Int = 250
-- EndRegion
SELECT 
[Project1].[MyColumn1] AS [MyColumn1], 
[Project1].[MyNullableSortColumn] AS [MyNullableSortColumn]
FROM ( SELECT 
    CASE WHEN ([Extent1].[MyNullableSortColumn] IS NULL) THEN @p__linq__0 ELSE [Extent1].[MyNullableSortColumn] END AS [C1], 
    [Extent1].[MyColumn1] AS [MyColumn1], 
    [Extent1].[MyNullableSortColumn] AS [MyNullableSortColumn]
    FROM [dbo].[MyTable] AS [Extent1]
)  AS [Project1]
ORDER BY [Project1].[C1] ASC

順便說一句 ,我建議使用LINQPad ,它可以讓你使用你的EF模型並查看正在生成的sql。 此外,了解EntityFunctions類和SqlFunctions類是有幫助的,因為它們提供了對幾個有用函數的訪問。

暫無
暫無

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

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