C#&.NET, .NET Core程序中如何使用Linq实现综合类似SQL的LEFT JOIN,SUM和GROUP BY查询语句呢?
在C#&.NET, .NET Core的程序编程开发中,如何使用Linq实现综合使用类似SQL的LEFT JOIN,SUM和GROUP BY查询语句呢?
比如在订单管理系统或电子商务平台中用于表示订单信息的Order
类和产品信息的Product
类。订单信息类Order
包含了订单的基本信息,包括订单编号OrderId
、产品编号ProductId
、数量Quantity
和产品对象Product
。订单类用于记录用户购买商品的订单信息,订单对象中包含的产品编号可以和产品信息类 Product 进行关联。
产品信息类Product
包含了产品的基本信息,包括产品编号ProductId
、名称Name
和价格Price
。产品信息类用于记录产品的基本信息,如名称、价格等,这些信息将在订单中使用。
现在有订单类和产品类如下:
// 订单信息类
public class Order {
public int OrderId { get; set; }
public int ProductId { get; set; }
public int Quantity { get; set; }
public Product Product { get; set; }
}
// 产品信息类
public class Product {
public int ProductId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
示例数据如下:
// 创建一个包含订单信息的集合
List<Order> orders = new List<Order>
{
new Order { OrderId = 1, ProductId = 1, Quantity = 2 },
new Order { OrderId = 2, ProductId = 2, Quantity = 1 },
new Order { OrderId = 3, ProductId = 1, Quantity = 3 },
new Order { OrderId = 4, ProductId = 3, Quantity = 2 },
new Order { OrderId = 5, ProductId = 2, Quantity = 1 },
new Order { OrderId = 6, ProductId = 1, Quantity = 4 }
};
// 创建一个包含产品信息的集合
List<Product> products = new List<Product>
{
new Product { ProductId = 1, Name = "iPhone X", Price = 7999 },
new Product { ProductId = 2, Name = "iPad Pro", Price = 5999 },
new Product { ProductId = 3, Name = "Apple Watch", Price = 2999 },
new Product { ProductId = 4, Name = "Macbook Pro", Price = 12999 }
};
要求在C#&.NET Core程序中,使用Linq的LEFT JOIN
,GROUP BY
以及SUM
等按产品名称分组查询出每个产品的总销售数量及总销售金额。
期望结果如下:
| 产品名称 | 订单总量 | 销售总额 |
|-------------|-------------|-------------|
| iPhone X | 9 | 71991 |
| iPad Pro | 2 | 11998 |
| Apple Watch | 2 | 5998 |
1 个回答
-
以下是一个在C#&.NET Core(.NET 7)程序中使用Linq(LEFT JOIN,GROUP BY,SUM)实现产品销售情况统计的完整示例:
运行结果:
以上LINQ查询的目的是查询每个产品的订单总量和销售总额。
为了实现这一点,首先使用了一个左外连接(Left Join)将订单信息集合(
orders
)和产品信息集合(products
)连接在一起,然后使用group by
按照产品名称(Name
)进行分组,并使用Sum
函数分别计算订单总量(TotalQuantity
)和销售总额(TotalSales
)。因为使用了Left Join,即使某些产品没有订单也能出现在结果中,同时也可以计算出没有产品信息的订单的销售额。最终的结果集包括产品名称(
Name
)、订单总量(TotalQuantity
)和销售总额(TotalSales
)这三个字段。考虑到存在一些订单没有产品信息,因此我们使用了
DefaultIfEmpty
函数来将每个订单和一个空的产品信息进行匹配。同时,在结果集中使用了空值条件运算符(?.
),以便在没有匹配到产品信息时不会引发异常。注意,C# Linq查询中的变量名和类属性名与SQL查询中的表名和字段名可能不完全相同。