如何在Entity Framework中执行SUM操作

12

我有一张桌子。

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();

有人可以帮我使用Entity Framework完成这个任务吗? 我正在使用MVC 4 Razor。


什么出了问题? - Ivan Stoev
2
哎呀,我想我看到了。为什么Price是字符串(nvarchar(15))? - Ivan Stoev
我的Entity Framework查询 - Durgesh Pandey
我怀疑你的SQL查询是否有效。只要可以对“Price”列进行求和,EF查询也是可以的,但这在你的数据中并不适用。 - Ivan Stoev
你需要使用 .ToList() 从数据库中获取条目并在内存中进行转换。 - DevilSuichiro
显示剩余2条评论
4个回答

20
也许您可以使用Lambda表达式。
var total=db.tblCartItems.Where(t=>t.CartId == cartId).Sum(i=>i.Price);

无法将“string”隐式转换为“decimal”,因为在数据库中我的Price列是NVARCHAR类型,所以我需要使用以下代码:var total = db.tblCartItems.Where(t => t.CartId == cartId).Sum(i => Convert.ToDecimal(i.Price)); - Durgesh Pandey
但是,LINQ to Entities现在不认识'System.Decimal ToDecimal(System.String)'方法,而且这个方法无法被转换成一个存储表达式。 - Durgesh Pandey
没问题,那么你在价格列中有什么值?在此之前,你可以指定选择第一个,例如:var total = db.tblCartItems.Where(t => t.CartId == cartId).Select(p=>CovertToDecial(p)).Sum(i => i); - hemantsharma
相同的问题,LINQ to Entities 不识别 'System.Decimal ToDecimal(System.Object)' 方法,该方法无法转换为存储表达式。 - Durgesh Pandey
这是“正确”的答案,我的谷歌搜索与十进制/数据类型无关,只是“如何在Linq中进行求和”导致我到达了这里。 - Brian Birtle

3

它正在运作,试试这个...

使用 Decimal.Parse 将价格转换。

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

1

Decimal.parse无法工作,请尝试使用Convert.toDouble

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

0

最终我找到了一个解决方案,虽然不是来自Entity Framework,但它有效...

 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;
        } 

通过这个解决方案,您可以将所有信息传递给客户端并在客户端上完成工作,因此根据某些情况,性能可能会成为问题。但是它肯定有效。 - Álvaro García
最好将这项工作推到数据库端,只返回总和本身,而不是实体。 - Brian Birtle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接