Как группировать в LINQ - PullRequest
0 голосов
/ 07 апреля 2020

Goodmorning Мне нужна помощь для создания запроса LINQ для этого объекта

    public class Equipment
    { 
            public string Id { get; set; }
            public string Description{ get; set; }
            public string Productor{ get; set; }
            public List<Movement> Movements{ get; set; }
            public double DailyNeeding { get; set; }
    }

Класс Movement это

public class Movement
{
    public double Quantity{ get; set; }
    public DateTime MovementDate { get; set; }
    public string Note { get; set; }
    public DateTime Expiry { get; set; }
    public string Destination { get; set; }
}

Мне нужно получить некоторые данные в соответствии с этой моделью

public class EquipmentModels
    {
        public string Id { get; set; }
        public string Description{ get; set; }
        public string Productor { get; set; }
        public double Amount { get; set; }
        public DateTime ExhaustionDate { get; set; }
        public string Place { get; set; }
    }

На данный момент я сделал это

    List<Equipment> mat = //code for retrieve list

    List<EquipmentModels> matList = new List<EquipmentModels>();
    foreach(Equipment m in mat)
    {
         EquipmentModels lm = new EquipmentModels();

         foreach(Movement mov in m.Movements)
         {
              if(mov.Destination == id) //id of place
              {
                   lm.Amount += mov.Quantity;
                   lm.Description = m.Description;
                   lm.ExhaustionDate = DateTime.Now.AddDays(lm.Amount / m.DailyNeeding);
                   lm.Id = m.Id;
                   lm.Productor = m.Productor;
                   lm.Place = "Pippo";
               }
          }

          if (lm.Amount> 0) matList.Add(lm);
      }

Как я могу сделать с LINQ?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Это синтаксис запроса с группировкой LINQ:

List<Equipment> mat = new List<Equipment>();//code for retrieve list

List<EquipmentModels> matList =
    (from equipment in mat
     group equipment by new
     { equipment.Id, equipment.Productor, equipment.DailyNeeding, equipment.Description }
        into groupped
     select new EquipmentModels
     {
         Id = groupped.Key.Id,
         Productor = groupped.Key.Productor,
         Place = "Pippo",
         Amount = groupped.Sum(i => i.Movements
             .Where(m => m.Destination == destinationId)
             .Sum(m => m.Quantity)),
         Description = groupped.Key.Description,
         ExhaustionDate =
             DateTime.Now.AddDays(groupped.Sum(i => i.Movements
                                      .Where(m => m.Destination == destinationId)
                                      .Sum(m => m.Quantity)) /
                                  groupped.Key.DailyNeeding),

     }).Where(i => i.Amount > 0)
    .ToList();
1 голос
/ 07 апреля 2020

Похоже, вам понадобится только метод Select, потому что ваше текущее решение не показывает ничего для группировки по

var id = "test";
var mat = new List<Equipment>();
var result = mat.Select(e =>
    {
        var amount = e.Movements.Where(m => m.Destination == id).Sum(m => m.Quantity);
        return new EquipmentModels
        {
            Description = e.Description,
            Id = e.Id,
            Productor = e.Productor,
            Amount = amount,
            ExhaustionDate = DateTime.Now.AddDays(amount / e.DailyNeeding)
        };
    })
    .Where(m => m.Amount > 0);

Получите значение суммы для Movements сначала, затем сопоставьте свойства каждого Equipment экземпляра с новым EquipmentModels экземпляром. Наконец, отфильтруйте результат с Amount больше, чем 0

1 голос
/ 07 апреля 2020

Это будет что-то вроде этого

        mat.Select(x =>
        {
            var amount = x.Movements.Where(move => move.Destination == id).Sum(mv => mv.Quantity);
            return new EquipmentModels
            {
                Amount = amount,
                Description = x.Description,
                ExhaustionDate = System.DateTime.Now.AddDays(amount / x.DailyNeeding),
                Id = x.Id,
                Productor = x.Productor,
                Place = "Pippo",
            };
        }).Where(x => x.Amount > 0).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...