【问题标题】:What is the equivalent method to ISNULL() in .Net (C#)?.Net(C#)中与 ISNULL() 等效的方法是什么?
【发布时间】:2012-09-02 18:22:35
【问题描述】:

我有一个用于我的购物车系统的存储过程,它返回总金额,如下所示;

ALTER PROCEDURE [dbo].[ShoppingCartGetTotalAmount]
(@CartID char(36))
AS
SELECT ISNULL(SUM(Product.Price * ShoppingCart.Quantity), 0)
FROM ShoppingCart INNER JOIN Product
ON ShoppingCart.ProductID = Product.ProductID
WHERE ShoppingCart.CartID = @CartID

但是,现在我想在实体框架中做同样的事情。因此,我需要知道以下任一选项;
1) 如何在 Entity FrameWork i-e 中完成上述任务

SELECT ISNULL(SUM(Product.Price * ShoppingCart.Quantity), 0)
    FROM ShoppingCart INNER JOIN Product
    ON ShoppingCart.ProductID = Product.ProductID
    WHERE ShoppingCart.CartID = @CartID

2) 或者 C# 中 SQL ISNULL() 函数的等价物是什么?
3) 或者我该如何实现 -> ISNULL(SUM(Product.Price * ShoppingCart.Quantity), 0) 使用任何 .Net 方法?

【问题讨论】:

  • 你考虑过ExecuteFunction而不是重构轮子吗?
  • Entity Framework 有 ExecuteFunction 允许你调用存储过程。
  • 我明白了,但是我想使用实体框架查询(因为我已经使用过ado.net),现在我想学习实体框架。因此,我暂时不打算使用存储过程。

标签: c# sql entity-framework ado.net


【解决方案1】:

C# 有 null coalesce operator - ??

??运算符称为空合并运算符,用于为可空值类型或引用类型定义默认值。如果操作数不为空,则返回左侧操作数;否则返回正确的操作数。

EF 理解该运算符并正确翻译。

【讨论】:

    【解决方案2】:

    如果要判断从数据库中读取的某个值在数据库中是否为空,则需要将该值与 DBNull.Value 进行比较。

    例如,假设在下面的代码中,oTotal 持有 Price * Quantity 的数据库结果,下面相当于 SQL ISNULL 操作:

    decimal dTotal = (oTotal == DBNull.Value ? 0 : Convert.ToDecimal(oTotal));
    

    【讨论】:

      【解决方案3】:

      在 C# 中,存在一个扩展方法 GetValueOrDefault 用于可空类型。所以你也可以试试这个。如果 null 包含,它将返回默认值。

      decimal? oTotal = null;
      decimal dTotal = oTotal.GetValueOrDefault(0);
      

      【讨论】:

        猜你喜欢
        • 2018-04-02
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 2019-06-26
        • 2010-11-27
        • 2011-04-01
        • 1970-01-01
        • 2021-05-13
        相关资源
        最近更新 更多