Nullable在实体框架中使用默认值

本文关键字:默认值 框架 实体 int Nullable | 更新日期: 2023-09-27 18:12:25

我们正在迁移一些代码来使用实体框架,并有一个查询,试图对Nullable字段进行排序,并提供一个默认的排序值,该值使用Nullable. getvalueordefault (T)函数为空。

但是,在执行时返回以下错误:

LINQ to Entities不能识别'Int32 GetValueOrDefault(Int32)'方法,并且该方法不能转换为存储表达式。

查询如下:

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

从这个答案我可以看出,有一种方法可以在您的EDMX中提供"翻译"。我们可以为这个合并函数写一个类似的转换吗?

注意:当我尝试时,??合并操作符而不是GetValueOrDefault在查询中确实有效。所以,也许是什么让它发挥作用?

Nullable<int>在实体框架中使用默认值

我相信你找到了答案。当您使用??时,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类也很有帮助,因为它们提供了对几个有用函数的访问。