而不是仅仅写一条SQL语句,定义你的目标会更有帮助。你有一些表格,你想从中提取信息。你想要哪些信息?现在我必须猜测你的结构。
看来你有订单和产品和OrderProducts。
每个订单都有零个或多个OrderProducts;每个OrderProduct都属于一个Order。每个订单也有一个CreateAt属性。
每个产品都有零个或多个OderProducts;每个OrderProduct都属于一个Product。每个产品还有一个单价和折扣。
最后每个OrderProduct有一个属性数量
你没有提到是否要使用实体框架或没有。但即使没有,您也可以使用IQueryables访问这三个表。在实体框架,这是通过DbSets完成:
IQueryable<Product> products = ...
IQueryable<Order> orders = ...
IQueryable<OrderProduct> orderProducts = ...
查询在婴儿的步骤:
var joinedItems = from product in Products
join orderProduct in orderProducts on oderProduct.ProductId == product.Id
join order in orders on order.Id == orderProduct,OrderId
select new
{
Quantity = orderProduct.Quantity,
UnitPrice = product.UnitPrice,
Discount = product.Discount,
CreateAt = order.CreateAt,
};
多次join是我使用的查询语法,而不是方法的语法唯一的一次。 Click here to see the method syntax for multiple joins
因为每一个产品只有一个单价,我想你不希望一个产品的所有单价的总和,但你希望所有Unitprices对CreateAt创建项目的总和,同样所有的总和折扣和数量。
所以我们第一组的所有joinedItems到joinedItems具有相同CreateAt:
var itemsGroupedByCreateAt = joinedItems
.GroupBy(joinedItem => joinedItem.CreateAt);
在口头上:采取一切joinedItems,并将它们组合成,其中组中的所有joinedItems有CreateAt相同的值组。
结果是组的序列。每个小组都加入了项目。组中的所有连接项都具有相同的CreateAt值。这个共同的价值是团队的关键。
因此,您所要做的就是让每个组对所有组合中的所有物件的UnitPrices进行求和。为数量和折扣做同样的事情。请注意,每个组都将创建一个sumResult:
var sumResults = itemsGroupedByCreateAt
.Select(group => new
{
TotalQuantity = group
.Select(groupElement => groupElement.Quantity)
.Sum(),
TotalUnitPrice = group
.Select(groupElement => groupElement.UnitPrice)
.Sum(),
Totaldiscount = group
.Select(groupElement => groupElement.UnitPrice)
.Sum(),
// only if you need it in your result:
CreateAt = group.Key,
});
用词:取所有您的组加入项目。从每个组中取出组中的joinedItems。从这些加入的项目中只取出数量,然后求和它们。将结果放入总量。 为单价和折扣做同样的事情
当然,您可以在一个大的linq声明中做到这一点。不确定这是否会提高可读性和可维护性。
请显示你的尝试。如果你想要一个linq解决方案,你必须付出一些努力。 SO不是代码翻译服务 –