在Entity Framework中使用默认值对Nullable<int>进行OrderBy排序

6
我们正在将一些代码迁移到Entity Framework,并且有一个查询尝试对Nullable字段进行排序,如果该值为null,则使用Nullable.GetValueOrDefault(T)函数提供默认排序值。
但是,在执行时它会返回以下错误:
LINQ to Entities不识别'Int32 GetValueOrDefault(Int32)'方法,这个方法无法转换成存储表达式。
查询如下:
int magicDefaultSortValue = 250;
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn
                                          .GetValueOrDefault(magicDefaultSortValue));

这个答案中,我可以看到在EDMX中提供“翻译”的方法。我们能否为这个合并函数编写类似的翻译呢?

注意:当我尝试使用查询中的?? 合并运算符而不是GetValueOrDefault时,它确实起作用。因此,也许可以利用任何使其工作的东西?

1个回答

12

我相信你已经找到了答案。当你使用??时,EF会生成一个CASE语句来选择你的排序值,如果该值为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 类也很有帮助,因为它们提供了许多有用的函数。


谢谢!不过,我发现??可以工作后,希望不必编辑我已经针对LINQ To SQL上下文编写的使用GetValueOrDefault()的现有查询。 - Reddog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接