namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries { using Dapper; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Threading.Tasks; public class OrderQueries : IOrderQueries { private string _connectionString = string.Empty; public OrderQueries(string constr) { _connectionString = !string.IsNullOrWhiteSpace(constr) ? constr : throw new ArgumentNullException(nameof(constr)); } public async Task GetOrderAsync(int id) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); var result = await connection.QueryAsync( @"select o.[Id] as ordernumber,o.OrderDate as date, o.Description as description, o.Address_City as city, o.Address_Country as country, o.Address_State as state, o.Address_Street as street, o.Address_ZipCode as zipcode, os.Name as status, oi.ProductName as productname, oi.Units as units, oi.UnitPrice as unitprice, oi.PictureUrl as pictureurl FROM ordering.Orders o LEFT JOIN ordering.Orderitems oi ON o.Id = oi.orderid LEFT JOIN ordering.orderstatus os on o.OrderStatusId = os.Id WHERE o.Id=@id" , new { id } ); if (result.AsList().Count == 0) throw new KeyNotFoundException(); return MapOrderItems(result); } } public async Task> GetOrdersFromUserAsync(Guid userId) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); return await connection.QueryAsync(@"SELECT o.[Id] as ordernumber,o.[OrderDate] as [date],os.[Name] as [status], SUM(oi.units*oi.unitprice) as total FROM [ordering].[Orders] o LEFT JOIN[ordering].[orderitems] oi ON o.Id = oi.orderid LEFT JOIN[ordering].[orderstatus] os on o.OrderStatusId = os.Id LEFT JOIN[ordering].[buyers] ob on o.BuyerId = ob.Id WHERE ob.IdentityGuid = @userId GROUP BY o.[Id], o.[OrderDate], os.[Name] ORDER BY o.[Id]", new { userId }); } } public async Task> GetCardTypesAsync() { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); return await connection.QueryAsync("SELECT * FROM ordering.cardtypes"); } } private Order MapOrderItems(dynamic result) { var order = new Order { ordernumber = result[0].ordernumber, date = result[0].date, status = result[0].status, description = result[0].description, street = result[0].street, city = result[0].city, zipcode = result[0].zipcode, country = result[0].country, orderitems = new List(), total = 0 }; foreach (dynamic item in result) { var orderitem = new Orderitem { productname = item.productname, units = item.units, unitprice = (double)item.unitprice, pictureurl = item.pictureurl }; order.total += item.units * item.unitprice; order.orderitems.Add(orderitem); } return order; } } }