LINQ - сумма в зависимости от нескольких условий - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу создать запрос linq, который будет суммировать общее количество заказов клиентов. В зависимости от того, какой клиент уже заказал, мне нужно применить мультипликатор в зависимости от типа продукта. Например, Заказчик заказал один продукт SaaS и два продукта PaaS. Для каждого продукта PaaS в этом порядке я хочу умножить цену на 1,5, а для SaaS цена будет умножена на 0,8.

Сейчас у меня есть код, который даст мне общую сумму, независимо от продукта, продукта. Как я могу написать запрос, который будет суммировать продукты для каждого клиента в зависимости от типа продукта, который заказал клиент? Я также хочу, чтобы это было в форме словаря, поэтому для каждого идентификатора у меня будет сумма всех заказов.

Вот небольшой фрагмент кода, который я подготовил, для лучшего понимания:

    public class Calculator
    {
        public void Calculate()
        {           
            // Let's pretend that customers comes from some sort of DB context
            IDictionary<int, decimal> totalls = customers
                .ToDictionary(c => c.ID, c => c.OrderItems.Sum(oi => oi.PriceNet));

            foreach (KeyValuePair<int, decimal> item in totalls)
            {
                Console.WriteLine($"{item.Key} {item.Value}");
            }
        }
    }

    public class Order
    {
        public Customer Customer { get; set; }
        public ICollection<OrderItem> OrderItems { get; set; }

        public Order()
        {
            this.OrderItems = new List<OrderItem>();
        }
    }

    public class OrderItem
    {
        public Customer Customer { get; set; }
        public Order Order { get; set; }
        public decimal PriceNet { get; set; }
        public Product Product { get; set; }
    }

    public class Customer
    {
        public int ID { get; set; }
        public ICollection<Order> Orders { get; set; }
        public ICollection<OrderItem> OrderItems { get; set; }

        public Customer()
        {
            this.Orders = new List<Order>();
            this.OrderItems = new List<OrderItem>();
        }
    }

    public class Product
    {
        public EnumProductType Type { get; set; }
    }

    public enum EnumProductType
    {
        SAAS,
        PAAS
    }

1 Ответ

2 голосов
/ 06 февраля 2020

Пожалуйста, попробуйте это:

var totalls = customers.ToDictionary(customer => customer.ID, customer => customer.OrderItems.Sum(oi => oi.Product.Type == EnumProductType.PAAS
                ? oi.PriceNet * 1.5m
                : oi.PriceNet * 0.8m));

Итак, пожалуйста, измените ваш Calculator::Calculate метод следующим образом:

public class Calculator
{
    public void Calculate()
    {           
        // Let's pretend that customers comes from some sort of DB context
        /*IDictionary<int, decimal> totalls = customers
            .ToDictionary(c => c.ID, c => c.OrderItems.Sum(oi => oi.PriceNet));*/

        var totalls = customers.ToDictionary(customer => customer.ID, customer => customer.OrderItems.Sum(oi => oi.Product.Type == EnumProductType.PAAS
                ? oi.PriceNet * 1.5m
                : oi.PriceNet * 0.8m));

        foreach (KeyValuePair<int, decimal> item in totalls)
        {
            Console.WriteLine($"{item.Key} {item.Value}");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...