如何从一个订单到列表获取所有产品

时间:2019-04-02 15:32:56

标签: sql sql-server linq

我写了一个返回数据的查询,这是我的代码

SELECT o.Id, p.ProductName, po.Quantity, p.Price, DeliveryMethod, 
OrderDate, TotalSum, u.UserName FROM [Order] o
JOIN ProductsOrders po ON o.Id = po.OrderId
JOIN Product p ON po.ProductId = p.Id
JOIN Users u ON o.UserId = u.Id
ORDER BY o.Id

然后返回下一个:

OrderId ProductName Quantity Price DeliveryMethod OrderDate TotalSum UserName
98         Bed3       1      3000    Express    2018-08-04  7015    Ivan
98         Bed4       1      4000    Express    2018-08-04  7015    Ivan
100        Bed2       1      2000               2018-08-05  2000    Ivan
101        Bed2       1      2000               2018-08-05  5000    Ivan
101        Bed3       1      3000               2018-08-05  5000    Ivan
102        Bed0       1        0    Standard    2018-09-04  1005    Ivan

我们可以注意到,对于每种产品-一个记录

但是我想按一个订单将所有产品分组,并得到类似的东西:

- orderId
- deliveryMethod
- userName
  - product1   quantity    price
  - ...
  - productN   quantity    price
- totalAmount

101
Courier
John Doe
  Black bag       1   1500
  Fat Bike        1   5000
  Thermos bottle  5   200
Total amount      7500

如何修改查询?

2 个答案:

答案 0 :(得分:0)

IMO的正确方法是选择2个数据集。第一个数据集包含父Order数据,第二个数据集包含第一个数据集中订单的各个ProductsOrders(产品订单项)。

-- Select Orders
SELECT
     [o].[Id] AS [OrderId]
    ,[o].[DeliveryMethod]
    ,[o].[OrderDate]
    ,[u].[UserName]
FROM [Order] [o]
    INNER JOIN [Users] [u] ON [o].[UserId] = [u].[Id]
WHERE
    [o].[Id] IN(SomeRangeOfOrderIds) -- (Or however you'd like to filter the results)


-- Select Products (product line items)
SELECT
     [p].[ProductName]
    ,[po].[Quantity]
    ,[p].[Price]
FROM [ProductsOrders] [po]
    INNER JOIN [Product] [p] ON [po].[ProductId] = [p].[Id]
WHERE
    [po].[OrderId] IN(SameRangeOfOrderIdsAsTheQueryAbove)

...然后获取这些结果并根据需要显示它们。这会出现在报告中吗?还是在网页上?

答案 1 :(得分:0)

我刚刚在LINQ中实现了此问题。应该注意到,存在多对多关系

var orders = db.Orders.Select(o => new
        {
            o.Id,
            o.DeliveryMethod,
            o.OrderDate,
            o.UserId,
            o.TotalSum,
            Products = o.ProductsOrders.Select(p => new { p.Product.ProductName, p.Quantity, p.Product.Price}).ToList()
        }).ToList();