2

我有一个用于我的购物车系统的存储过程,它返回总金额,看起来像这样;

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)我怎样才能在实体框架中完成上述任务,即

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方法?

4

3 回答 3

7

C# 具有空合并运算符- ??

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

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

于 2012-09-02T18:24:58.113 回答
1

如果您试图确定从数据库中读取的值在数据库中是否为空,则需要将该值与 DBNull.Value 进行比较。

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

decimal dTotal = (oTotal == DBNull.Value ? 0 : Convert.ToDecimal(oTotal));
于 2012-09-02T18:28:46.673 回答
0

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

decimal? oTotal = null;
decimal dTotal = oTotal.GetValueOrDefault(0);
于 2012-09-02T18:34:21.193 回答