public async Task <Unit> Handle(AddBill request, CancellationToken cancellationToken) { if (request.Purchases.Count() == 0) { throw new InvalidOperationException(); } var store = storeRepository .Queryable() .FirstOrDefault(s => s.Id.Equals(new StoreId(request.StoreId))); var bill = new Bill(request.Date, store); var productsIds = request.Purchases .Where(p => p.Product.Id != Guid.Empty) .Select(pu => new ProductId(pu.Product.Id)) .ToList(); var x = productRepository .Queryable() .Where(p => productsIds.Contains(p.Id)) .ToList(); var existingProducts = request.Purchases .Where(p => p.Product.Id != Guid.Empty) .Select( p => new { Product = x.FirstOrDefault(pr => pr.Id == new ProductId(p.Product.Id)), p.Amount, p.Price } ) .ToList(); foreach (var product in existingProducts) { bill.AddPurchaseBasedOnExistingProduct(product.Product, product.Amount, product.Price); } var categories = categoryRepository.Queryable().ToList(); var newProducts = request.Purchases .Where(p => p.Product.Id == Guid.Empty) .Select( p => new { p.Product, Category = categories.FirstOrDefault(c => c.Id.Value == p.Product.CategoryId), p.Amount, p.Price }) .ToList(); foreach (var product in newProducts) { var prod = product.Product; var newPurchase = bill.AddPurchaseBasedOnNewProduct( prod.Name, prod.Barcode, product.Category, product.Amount, product.Price ); var category = categories.FirstOrDefault(cat => cat.Id.Value == prod.CategoryId); productRepository.Insert(newPurchase.Product); } repository.InsertAggregate(bill); return(Unit.Value); }