Как лучше использовать GroupBy в LINQ?

Всем привет,

Мы часто используем LINQ. Это очень продвинутая технология запросов. Хочу пояснить на одном примере.

В первую очередь наши модели;

public class UpdateBasketRequest
{
public string BuyerId { get; set; }
public IEnumerable<UpdateBasketRequestItemData> Items { get; set; }
}
public class UpdateBasketRequestItemData
{
public string Id { get; set; }          // Basket id
public int ProductId { get; set; }      // Catalog item id
public int Quantity { get; set; }       // Quantity
public UpdateBasketRequestItemData(string Id, int ProductId, int Quantity)
{
this.Id = Id;
this.ProductId = ProductId;
this.Quantity = Quantity;
}

Основная часть это:

UpdateBasketRequest data = new UpdateBasketRequest();
data.BuyerId = "1";
data.Items = new List<UpdateBasketRequestItemData> {
new UpdateBasketRequestItemData("1", 1, 2),
new UpdateBasketRequestItemData("1", 2, 2),
new UpdateBasketRequestItemData("1", 3, 5),
new UpdateBasketRequestItemData("2", 2, 5) };
//Id, ProductId, Quantity
var itemsCalculated = data
.Items
.GroupBy(x => x.ProductId, x => x, (k, i) => new { productId = k, items = i })
.Select(groupedItem =>
{
var item = groupedItem.items.First();
item.Quantity = groupedItem.items.Sum(i => i.Quantity);
return item;
});
foreach (var i in itemsCalculated)
{
Console.WriteLine(i.Id);
Console.WriteLine(i.ProductId);
Console.WriteLine(i.Quantity);
Console.WriteLine("*****");
}

По сути, любой покупатель может иметь несколько корзин, может положить любой продукт, также каждый продукт может быть несколькими.

В нашем примере есть покупатель.

У этого покупателя 2 корзины.

В первой корзине 2 товара с номером 1, 2 товара с номером 2 и 5 товаров с номером 3.

Во второй корзине 5 товаров товара номер 2.

Все товары группируются по productId. Когда мы группируем с идентификатором продукта, результатом является идентификатор продукта и количество продуктов.

product id:1
Quantity: 2
*****
product id:2
Quantity: 7
*****
product id:3
Quantity: 5
*****

Удачи.

Этот пример на моем github; https://github.com/taskinbinbir/LinqGroupByApp

Вы можете следить за моим списком Entity Framework и LINQ, чтобы узнать больше; https://taskinbinbir.medium.com/list/entity-framework-0a2b9ee4b7c3

ссылка; https://github.com/dotnet-architecture/eShopOnContainers