【问题标题】:OrderBy on a Nullable<int> with a default value in Entity Framework实体框架中具有默认值的 Nullable<int> 上的 OrderBy
【发布时间】:2011-10-26 23:18:32
【问题描述】:

我们正在迁移一些代码以使用 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));

来自this answer I can see that there is a way to provide "translations" within your EDMX。我们可以为这个合并函数写一个类似的翻译吗?

注意:当我尝试时,?? 合并运算符而不是查询中的 GetValueOrDefault 确实有效。那么也许可以利用任何使这项工作发挥作用的东西?

【问题讨论】:

    标签: c# .net entity-framework linq-to-entities


    【解决方案1】:

    我相信你找到了答案。当您使用?? 时,如果值为null,EF 会使用CASE 生成SQL 来选择您的排序值,然后对其进行排序。

    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 类也很有帮助,因为它们提供了对几个有用功能的访问。

    【讨论】:

    • 谢谢!但是,在我发现 ?? 可以工作后,我希望不必编辑已经使用 GetValueOrDefault() 的现有查询(针对 LINQ To SQL 上下文编写)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多