在MVC 4应用程序中,使用什么样的语法/技术来计数购物车中的商品

本文关键字:技术 购物车 语法 MVC 应用程序 什么样 | 更新日期: 2023-09-27 18:11:02

我有一个类Cart:

using System.ComponentModel.DataAnnotations;
namespace MvcMusicStore.Models
{
    public class Cart
    {
        [Key]
        public int      RecordId    { get; set; }
        public string   CartId      { get; set; }
        public int      AlbumId     { get; set; }
        public int      Count       { get; set; }
        public System.DateTime DateCreated { get; set; }
        public virtual Album Album  { get; set; }
    }
}

,并且有一个类ShoppingCart,业务逻辑在其中编码。里面有我完全不懂的GetCount()方法。

   public int GetCount()
        {
            // Get the count of each item in the cart and sum them up
            int? count = (from cartItems in storeDB.Carts
                          where cartItems.CartId == ShoppingCartId
                          select (int?)cartItems.Count).Sum();
            // Return 0 if all entries are null
            return count ?? 0;
        }
  1. 什么是int? ?
  2. 是LINQ查询,SQL查询还是什么类型的查询,因为它看起来像SQL,但它使用的东西看起来像casting

编辑:第二个问题是指:(from cartItems in storeDB.Carts where cartItems.CartId == ShoppingCartId select (int?)cartItems.Count).Sum();而不是int?

它来自本教程:http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-8

在MVC 4应用程序中,使用什么样的语法/技术来计数购物车中的商品

int?是一个可空类型。在没有找到任何匹配where语句的情况下,函数会利用它。他什么时候回来数数??0,他合并计数,声明如果它为空,则返回0。

  1. int?Nullable<int>的缩写,是一种使不可空的原语类型int可空的方法。Nullable<T>struct(它本身也不能是null,因为它是struct)。为了使其工作,代码在编译时被转换为Nullable<T>上的其他调用。

  2. 这是一个LINQ语句,'by design'看起来很像SQL。

public int GetCount()
{
    // Get the count of each item in the cart and sum them up
    int? count = (from cartItems in storeDB.Carts
                      where cartItems.CartId == ShoppingCartId
                      select (int?)cartItems.Count).Sum();
    // Return 0 if all entries are null
    return count ?? 0;
}

int?Nullable<int>的简写。这意味着结果可以是整数,也可以是null

该查询为linq查询。它正在使用LINQ到实体提供程序,将查询转换为SQL,并将结果返回到int? count

底线return count ?? 0;就是

的简写
if (count == null)
{
    return 0;
}
else
{
    return count;
}

内部查询为LINQ "query"语法。括号没有强制转换任何东西…它们表示将返回结果集的内部查询,然后由Sum()方法(LINQ "method";语法).

如果更清楚的话,你可以把它分开:

var results = from cartItems in storeDB.Carts
              where cartItems.CartId == ShoppingCartId
              select (int?)cartItems.Count;
var sum = results.Sum();

或all in方法语法:

var results = storeDB.Carts
                     .Where(c => c.CartId == ShoppingCartId)
                     .Select(c => (int?)c.Count)
                     .Sum();

我不相信有任何理由检查Sum()是否返回空值(使用??),因为Sum()方法对于可空整型忽略空值。

从MSDN:

如果源文件不包含任何元素,该方法返回0。

结果不包含null值。

可能在解决可空的int问题上没有多大意义,因为其他答案/评论已经有了,但是这里有一个像样的页面显示了它的使用。