LINQ MVC查询等同于给定的SQL查询是什么?

时间:2019-01-12 13:15:21

标签: c# sql .net asp.net-mvc linq

我写了一个运行良好的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) };

4 个答案:

答案 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_DELIVEREDIS_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)
相关问题