【问题标题】:How to perform SUM operation in Entity Framework如何在实体框架中执行 SUM 操作
【发布时间】:2016-12-20 06:13:35
【问题描述】:

我有一张桌子。

create table tblCartItem(
pkCartItemId int primary key identity,
CartId int not null,
ProductId int not null,
Quantity int not null,
Price nvarchar(15)
)

我想像这样执行求和运算

Select SUM(Price) from tblCartItem where CartId='107'

我正在尝试遵循代码,但它不起作用

ObjTempCart.CartTotal = (from c in db.tblCartItems where c.CartId == cartId select c.Price).Sum();

任何人都可以帮助我使用实体框架来做到这一点。 我正在使用 MVC 4 Razor。

【问题讨论】:

  • 什么不起作用?
  • 糟糕,我想我看到了。为什么Price 是字符串(nvarchar(15))?
  • 我对实体框架的查询
  • 是投Price然后计算的任何方式
  • 我怀疑您的 SQL 查询是否有效。只要可以对Price 列求和,EF 查询也可以,而您的数据并非如此。

标签: asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-6


【解决方案1】:

也许你可以使用 lambda 表达式

var total=db.tblCartItems.Where(t=>t.CartId == cartId).Sum(i=>i.Price);

【讨论】:

  • 不能隐式转换为“字符串”到“十进制”,因为在数据库中我的价格列在 NVARCHAR 中,我做 var total = db.tblCartItems.Where(t => t.CartId == cartId).Sum(i => Convert.ToDecimal(i.Price));
  • 但是现在,LINQ to Entities 无法识别方法 'System.Decimal ToDecimal(System.String)' 方法,并且该方法无法转换为存储表达式。
  • 很好,那么你在价格列中有什么值?您可以在此之前先指定选择,例如 var total = db.tblCartItems.Where(t => t.CartId == cartId).Select(p=>CovertToDecial(p)).Sum(i => i);
  • 同样的问题,LINQ to Entities 无法识别方法 'System.Decimal ToDecimal(System.Object)' 方法,并且该方法无法翻译成存储表达式。
【解决方案2】:

最后我有一个解决方案,但它不完全来自实体框架,但它的工作......

 private double CartItemTotalPrice(Int32 CartID)
        {
            List<string> pricelst = new List<string>();
            pricelst = (from c in db.tblCartItems where c.CartId == CartID select c.Price).ToList();

            double Total = 0;

            if (pricelst != null)
            {
                for (int i = 0; i < pricelst.Count; i++)
                {
                    Total += Convert.ToDouble(pricelst[i]);
                }
            }

            return Total;
        } 

【讨论】:

    【解决方案3】:

    它的工作试试这个..

    使用 Decimal.Parse 转换价格。

    ObjTempCart.CartTotal =  db.tblCartItems.Where(t=>t.CartId == cartId).Select(i=>Decimal.Parse(i.Price)).Sum();
    

    【讨论】:

      【解决方案4】:

      Decimal.parse 不工作,试试 Convert.toDouble

      double total = _context.Projecao
            .Where(p => p.Id == idProj)
            .Select(i => Convert.ToDouble(i.ValorTotal)).Sum();
      

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        • 1970-01-01
        • 2013-10-31
        相关资源
        最近更新 更多