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在查询中确实有效。所以,也许是什么让它发挥作用?
我相信你找到了答案。当您使用??
时,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类也很有帮助,因为它们提供了对几个有用函数的访问。