我写了一个运行良好的SQL查询。我需要在LINQ MVC中使用它的等效查询。
select sum(od.QUANTITY*od.PRODUCT_PRICE)
from ORDERS as o
inner join ORDER_DETAILS as od
on o.ID = od.ORDER_ID where o.IS_DELIVERED = 1
AND o.IS_CANCELED = 0;
我试图自己创建它,并得到以下提到的查询,但是它对我不起作用;
var sum = from order in dbContext.ORDERS
join orderDetails in dbContext.ORDER_DETAILS
on order.ID equals orderDetails.ORDER_ID
where order.IS_DELIVERED == true && order.IS_RETURNED_BACK == false
select new { sum = dbContext.ORDER_DETAILS.Sum(od => od.QUANTITY * od.PRODUCT_PRICE) };
答案 0 :(得分:1)
如果您的DbContext具有正确的关系映射,则下面的代码有效
dbContext.ORDERS.ORDER_DETAILS
.Where(x => x.IS_CANCELLED == 0 && o.IS_RETURNED_BACK == false)
.Sum(od => od.PRODUCT_PRICE)
如果不是,则需要使用连接
var result = (from o in dbContext.ORDERS
join od in dbContext.ORDER_DETAILS
on o.ID equals od.ORDER_ID
where o.IsCancelled == 0 && && o.IS_RETURNED_BACK == false
select od.PRODUCT_PRICE).Sum();
答案 1 :(得分:0)
这是您的意思吗?这将创建一个订单明细总计列表,然后对该列表求和以提供一个价值。
GIsServer = true
答案 2 :(得分:0)
理想情况下,如果进行了正确的关系映射,则ORDERS
对象应具有ORDER_DETAILS
的列表。如果正确映射,IS_DELIVERED
和IS_RETURNED_BACK
也应为布尔值。在这种情况下,您不需要显式联接,并且C#LINQ可以很简单:
var sum = (from o in dbContext.ORDERS
where o.IS_DELIVERED && !o.IS_RETURNED_BACK
select new { Total = o.ORDER_DETAILS.QUANTITY * o.ORDER_DETAILS.PRODUCT_PRICE }
).Sum(x => x.Total);
此外,理想情况下,对象应该以pascal大小写命名,且不带下划线。
答案 3 :(得分:0)
您不需要select子句,可以对查询结果使用Sum函数,并为所需的字段计算指定lambda表达式。
var sum = (from order in dbContext.ORDERS
join orderDetails in dbContext.ORDER_DETAILS
on order.ID equals orderDetails.ORDER_ID
where order.IS_DELIVERED == true && order.IS_RETURNED_BACK == false).Sum(x=> x.QUANTITY * x.PRODUCT_PRICE)