LINQ - 总和取决于多个条件



我想创建一个 linq 查询,该查询将汇总客户订单总数。根据客户已经订购的产品,我需要根据产品类型应用不同的多路复用器。例如,客户订购了一个 SaaS 和两个 PaaS 产品。对于该顺序中的每个 PaaS 产品,我想将价格乘以 1.5,对于 SaaS,价格将乘以 0.8。

现在我有一个代码,无论产品是什么产品,它都会给我总金额。如何编写查询,根据客户订购的产品类型汇总每个客户的产品?我还希望它采用字典的形式,因此对于每个 ID,我将拥有所有订单的总和。

以下是我准备的一些代码,以便更好地理解:

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
}

请尝试以下操作:

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}");
}
}
}

最新更新