C# Группировка включенных объектов

#c# #.net #entity-framework #linq

Вопрос:

  public class Offer
{
    public int OfferId { get; set; }
    public string OfferName { get; set; }
    public ICollection<Item> Items { get; set; }
}
public class Item
{
    public int ItemId { get; set; }
    public string PartNo { get; set; }
    public decimal Price { get; set; }
    public int Quantity { get; set; }
    public int OfferId { get; set; }
    public Offer Offer { get; set; }
}
public class OfferSum
{
    public int OfferId { get; set; }
    public string OfferName { get; set; }
    public int ItemCount { get; set; }
    public decimal TotalSum { get; set; }
}
 

У меня есть 3 класса: Предложение, Товары и просмотр, называемый OfferSum. Я хотел бы использовать LINQ для заполнения представления OfferSum.

 FindAll() is returning IQueryable<Offer>
 

ItemCount должен возвращать количество товаров, включенных в предложение, totalSum должен возвращать цену * Количество товаров, включенных в предложение. Но я не знаю, как написать запрос.

У меня есть что-то вроде этого:

 var result = FindAll().
            Include(x=> x.Items).
            GroupBy(x => new { x.OfferId, x.OfferName})
            
            .Select(b => new OfferSum
            {
          OfferName = b.Key.OfferName,
          OfferId = b.Key.OfferId,
          ItemCount = b.Count(dont know),
          TotalSum = b.Sum(dont know)
          

        });
 

Комментарии:

1. ItemCount = b.Key.Items.Count() ?

Ответ №1:

Что-то вроде этого. Написано с использованием синтаксиса запроса, потому что он более понятен для понимания.

 var query = 
    from o in FindAll()
    from i in o.Items
    group i by new { o.OfferId, o.OfferName } into g
    select new OfferSum
    {
        OfferName = g.Key.OfferName,
        OfferId = g.Key.OfferId,
        ItemCount = g.Count(),
        TotalSum = g.Sum(x => x.Price * x.Quantity)
    };