99 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.eShopOnContainers.Services.Ordering.SqlData.UnitOfWork;
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel;
using Microsoft.eShopOnContainers.Services.Ordering.SqlData.Queries;
namespace Microsoft.eShopOnContainers.Services.Ordering.SqlData.Queries
{
//In this case, for the Application queries, we're using the same EF Context but another good approach
//is also to simply use SQL sentences for the queries with any Micro-ORM (like Dapper) or even just ADO.NET
//
//The point is that Queries are IDEMPOTENT and don't need to commit to DDD Domain restrictions
//so could be implemented in a completely orthogonal way in regards the Domain Layer (à la CQRS)
public class OrderingQueries : IOrderdingQueries
{
private OrderingDbContext _dbContext;
public OrderingQueries(OrderingDbContext orderingDbContext)
{
_dbContext = orderingDbContext;
}
public async Task<dynamic> GetAllOrdersIncludingValueObjectsAndChildEntities()
{
var orders = await _dbContext.Orders
.Include(o => o.ShippingAddress)
.Include(o => o.BillingAddress)
.Include(o => o.OrderItems)
.ToListAsync<Order>();
// Dynamically generated a Response-Model that includes only the fields you need in the response.
// This keeps the JSON response minimal.
// Could also use var
dynamic response = orders.Select(o => new
{
id = o.Id,
orderNumber = o.OrderNumber,
buyerId = o.BuyerId,
orderDate = o.OrderDate,
status = o.Status,
shippingAddress = o.ShippingAddress,
billingAddress = o.BillingAddress,
orderItems = o.OrderItems.Select(i => new
{
id = i.Id,
productId = i.ProductId,
unitPrice = i.UnitPrice,
quantity = i.Quantity,
discount = i.Discount
}
)
});
return response;
}
public async Task<dynamic> GetOrderById(Guid orderId)
{
var order = await _dbContext.Orders
.Include(o => o.ShippingAddress)
.Include(o => o.BillingAddress)
.Include(o => o.OrderItems)
.Where(o => o.Id == orderId)
.SingleOrDefaultAsync<Order>();
// Dynamically generated a Response-Model that includes only the fields you need in the response.
// This keeps the JSON response minimal.
// Could also use var
dynamic response = new
{
id = order.Id,
orderNumber = order.OrderNumber,
buyerId = order.BuyerId,
orderDate = order.OrderDate,
status = order.Status,
shippingAddress = order.ShippingAddress,
billingAddress = order.BillingAddress,
orderItems = order.OrderItems.Select(i => new
{
id = i.Id,
productId = i.ProductId,
unitPrice = i.UnitPrice,
quantity = i.Quantity,
discount = i.Discount
}
)
};
return response;
}
}
}