Можно ли упростить этот запрос LINQ? - PullRequest
1 голос
/ 10 августа 2011

Исходя из Java, я новичок в C # и LINQ.В нашей кодовой базе есть много запросов, которые, похоже, построены не оптимально.В следующем запросе лямбда-выражение GroupBy создает анонимный тип данных.Я не могу найти примеры онлайн, где GroupBy используется таким образом.Есть ли способ упростить этот запрос и при этом вернуть те же результаты?

 List<MachineMetrics> machines = prod.Where(p => p.TimeProduced >= start &&
                                      p.TimeProduced <= end &&
                                      (jobID == -1 ? true : (p.JobID == jobID && p.Job.MachineID == MachineID))).
                                GroupBy(x => new
                                             {
                                                 MachineName = x.Job.Machine.MachineName,
                                                 MachineID = x.Job.MachineID,
                                                 JobName = x.Job.JobName,
                                                 JobID = x.JobID
                                              }).
                                Select(item => new MachineMetrics()
                                              {
                                                 MachineName = item.Key.MachineName,
                                                 MachineID = item.Key.MachineID,
                                                 JobName = item.Key.JobName,
                                                 JobID = item.Key.JobID
                                              }).
                                ToList<MachineMetrics>();

edit: Спасибо за помощь.Проблема заключалась в том, что методы Equals () и GetHashCode () не были реализованы для класса.Как только я добавил их, я использовал код, предложенный @Ladislav Mrnka, и все заработало, как и ожидалось.

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Вы ищете это:

List<MachineMetrics> machines = prod.Where(p => p.TimeProduced >= start &&
                                                p.TimeProduced <= end &&
                                                (jobID == -1 || 
                                                    (p.JobID == jobID && p.Job.MachineID == MachineID))).
                                    .Select(x => new MachineMetrics()
                                          {
                                             MachineName = x.Job.Machine.MachineName,
                                             MachineID = x.Job.MachineID,
                                             JobName = x.Job.JobName,
                                             JobID = x.JobID
                                          })
                                    .Distinct()
                                    .ToList();
2 голосов
/ 10 августа 2011

Ответ Ладислава хорош, но просто чтобы показать другую альтернативу, сохраняющую GroupBy, вы можете уменьшить его до:

var machines = prod.Where(p => p.TimeProduced >= start &&
                               p.TimeProduced <= end &&
                               (jobID == -1 ? true : (p.JobID == jobID && p.Job.MachineID == MachineID))).
                    GroupBy(x => new MachineMetrics
                                 {
                                     MachineName = x.Job.Machine.MachineName,
                                     MachineID = x.Job.MachineID,
                                     JobName = x.Job.JobName,
                                     JobID = x.JobID
                                  }).
                    Select(item => item.Key). // 'item' is the grouping, and its 'Key' is the 'MachineMetrics' instance
                    ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...