EF Core Включить дочерние элементы после запроса с объединениями - PullRequest
0 голосов
/ 04 февраля 2019

Я использую .Net Core 2.0 и EF Core.Следующий запрос работает нормально, но не включает дочерние элементы.

Этот запрос выполняет объединение:

  • Order
  • OrderItem и
  • Продукт

Умножив количество (в OrderItem) на цену (в продукте) и выполнив сумму, я получу сумму заказа.

Теперь я пытаюсь включить "OrderItem" и "Product", как я хотел бы видеть в окончательном JSON моего веб-API.Таким образом, получение окончательного JSON со всеми тремя сущностями и итоговой суммой общей стоимости заказа.

Это мой репозиторий:

public class OrderRepository : IOrderRepository
{
    private readonly BasketDbContext _basketDbContext;
    public OrderRepository(BasketDbContext basketDbContext)
    {
        _basketDbContext = basketDbContext;
    }

    public Order GetOrderById(int id)
    {
        return (from o in _basketDbContext.Orders
                join oi in _basketDbContext.OrderItems on new { o.Id } equals new { Id = oi.OrderId }
                join p in _basketDbContext.Products on new { oi.ProductId } equals new { ProductId = p.Id }
                where o.Id == id
                group new { o, p, oi } by new
                {
                    o.Id,
                    o.OrderDate
                }
            into g
                select new Order
                {
                    Id = g.Key.Id,
                    OrderDate = g.Key.OrderDate,
                    TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
                })
            .Include(x => x.OrderItems)
            .ThenInclude(y => y.Product)
            .FirstOrDefault();
    }
}

Включения в методе GetOrderById не работают,но я не знаю, как включить их в такой запрос.

Это мои модели:

public class Order
{
    public int Id { get; set; }
    public DateTime OrderDate { get; set; }
    public decimal TotalPrice { get; set; }
    public List<OrderItem> OrderItems { get; set; }

    public decimal CalculateTotal()
    {
        return OrderItems.Sum(item => item.GetPrice());
    }
}

public class OrderItem
{
    public int Id { get; set; }
    [Required(ErrorMessage = "Empty OrderId")]
    public int OrderId { get; set; }
    [Required(ErrorMessage = "Empty ProductId")]
    public int ProductId { get; set; }
    [Required(ErrorMessage = "Empty Quantity")]
    [Range(1, 20, ErrorMessage = "Quantity must be between 1 to 20")]
    public int Quantity { get; set; }
    public Product Product { get; set; }

    public decimal GetPrice()
    {
        return Product.Price * Quantity;
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
}

Спасибо!

1 Ответ

0 голосов
/ 04 февраля 2019

Данные, которые вы получаете в порядке, - это то, что вы выбираете в запросе.то есть Id, OrderDate и TotalPrice:

select new Order
                {
                    Id = g.Key.Id,
                    OrderDate = g.Key.OrderDate,
                    TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
                })

Если вы хотите отобразить новый заказ здесь (например, id, orderDate и т. д.), то вам также необходимо сопоставить сущности «ItemOrder» и «Product» по полю.

Я думаю, что вы можете просто вернуть заказ, не создавая новый запрос в запросе, например:

return (from o in _basketDbContext.Orders where o.Id == id select o)
       .Include(x => x.OrderItems)
       .ThenInclude(y => y.Product)
       .FirstOrDefault();

Вычисление TotalPrice может быть выполнено для возвращенного результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...