2014-02-17 3 views
0

Есть коллекцию объектов, как показано нижеGroup и сумма и выборка с условием в Linq

UtilityName ="tank1"; 
Period ="A"; 
Value=170 

UtilityName ="tank1"; 
Period ="B"; 
Value=120 


UtilityName ="tank2"; 
Period ="A"; 
Value=220 


UtilityName ="tank2"; 
Period ="B"; 
Value=260 

UtilityName ="tank3"; 
Period ="A"; 
Value=0 

UtilityName ="tank3"; 
Period ="B"; 
Value=0 

UtilityName ="tank4"; 
Period ="A"; 
Value=10 

UtilityName ="tank4"; 
Period ="B"; 
Value=0 

Нужен запрос Linq, где я можно группировать объекты по UtilityName и сумма по «стоимости» собственностей и получить только те объекты, у которых суммирование больше нуля. В приведенном выше примере мне нужна коллекция, которая включает в себя весь объект, кроме/исключая объект Tank 3, суммирование которого равно 0;

ответ

0

Что-то вроде этого:

var result = objects 
    .GroupBy(
     o => o.UtilityName, 
     o => o, 
     (name, grouping) => new 
          { 
           Sum = grouping.Sum(o => o.Value), 
           Items = grouping 
          }) 
    .Where(a => a.Sum > 0) 
    .SelectMany(a => a.Items); 
0

Вы можете просто удалить значения с нулевым первым (если все элементы с таким же UtilityName имеет значение 0, то они не будут присутствовать в группах).

Если у вас нет отрицательных значений, это будет самый простой способ.

Но если вам нужен счет, например, это больше не будет работать.

var result = list.Where(m => m.Value > 0) 
       .GroupBy(m => m.UtilityName) 
       .Select(m => new { 
        UtilityName = m.Key, 
        SumValues = m.Sum(x => x.Value) 
       }); 

Меньше "хрупкий":

var result = list 
        .GroupBy(m => m.UtilityName) 
        .Select(m => new { 
         UtilityName = m.Key, 
         SumValue = m.Sum(x => x.Value) 
        }) 
        .Where(m => m.SumValue > 0); 

EDIT

Не ясно, если вы хотите, как результат, новый объект с суммой, или если сумма просто способом для исключения некоторых объектов ...

0
list.GroupBy(x => x.UtilityName) 
    .Where(x => x.Sum(y => y.Value) > 0) 
    .SelectMany(g => g); 
1

Вы можете попробовать:

var qry = from obj in list 
      group obj by obj.UtilityName into g 
      where g.Sum(x => x.Value) > 0 
      select new { UtilityName = g.Key, Value = g.Sum(x => x.Value)}; 
Смежные вопросы