2013-04-19 2 views
21

Я хочу сделать запрос с linq (список объектов), и я действительно не знаю, как это сделать, я могу сделать группу и сумму, но не могу выбрать остальную часть поля. Пример:Выберите несколько полей по сумме и сумме

ID Value  Name Category 
1 5   Name1 Category1 
1 7   Name1 Category1 
2 1   Name2 Category2 
3 6   Name3 Category3 
3 2   Name3 Category3 

Я хочу группе ID, SUM по значению и возвращает все поля, как это.

ID Value  Name Category 
1 12  Name1 Category1 
2 1   Name2 Category2 
3 8   Name3 Category3 
+0

У вас есть чек? http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b и ваш случай: http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – Aristos

+0

, поскольку все поля являются уникальными для каждый идентификатор, почему бы вам не включить их в группу. – Habib

+0

Да я могу сделать это, но у меня есть больше полей, чем это ... :( – user2112420

ответ

44

Обновлено: Если вы пытаетесь избежать группировки для всех полей, вы можете группа только на Id:

data.GroupBy(d => d.Id) 
    .Select(
     g => new 
     { 
      Key = g.Key, 
      Value = g.Sum(s => s.Value), 
      Name = g.First().Name, 
      Category = g.First().Category 
     }); 

Но этот код предполагает, что для каждого Id применяются те же Name и Category. Если это так, вы должны рассмотреть нормализацию, как предлагает @Aron. Это означало бы сохранение Id и Value в одном классе и перемещение Name, Category (и любые другие поля были бы одинаковыми для одного и того же Id) в другой класс, а также для справки Id. Процесс нормализации сокращает избыточность и зависимость данных.

+0

Да, я знаю это, но просто не хочу группировать все поля, было бы отличным способом, я пытаюсь сперва(), но тогда как суммировать? – user2112420

+0

Я обновил ответ. –

+0

Да, я знаю, что вы говорите, у меня нормализуется моя БД, это результат моего запроса, но для каждой строки моего запроса я повторяю его значения, и я хочу, чтобы их группировали и суммировали значение. – user2112420

2
void Main() 
{ 
      //Me being lazy in init 
    var foos = new [] 
    { 
     new Foo { Id = 1, Value = 5}, 
     new Foo { Id = 1, Value = 7}, 
     new Foo { Id = 2, Value = 1}, 
     new Foo { Id = 3, Value = 6}, 
     new Foo { Id = 3, Value = 2}, 
    }; 
    foreach(var x in foos) 
    { 
     x.Name = "Name" + x.Id; 
     x.Category = "Category" + x.Id; 
    } 
      //end init. 

    var result = from x in foos 
       group x.Value by new { x.Id, x.Name, x.Category} 
       into g 
       select new { g.Key.Id, g.Key.Name, g.Key.Category, Value = g.Sum()}; 
    Console.WriteLine(result); 
} 

// Define other methods and classes here 
public class Foo 
{ 
    public int Id {get;set;} 
    public int Value {get;set;} 

    public string Name {get;set;} 
    public string Category {get;set;} 
} 
+0

Я знаю этот путь, но я не хочу, чтобы в моей группе было столько полей, у меня их больше 7. – user2112420

+0

@ user2112420 Тогда вам придется нормализовать ваш класс. – Aron

+0

Это результат запроса I сделать из нескольких таблиц и создать объект такого типа. – user2112420

1

попробовать это:

var objList = new List<SampleObject>(); 

objList.Add(new SampleObject() { ID = 1, Value = 5, Name = "Name1", Category = "Catergory1"}); 
objList.Add(new SampleObject() { ID = 1, Value = 7, Name = "Name1", Category = "Catergory1"}); 
objList.Add(new SampleObject() { ID = 2, Value = 1, Name = "Name2", Category = "Catergory2"}); 
objList.Add(new SampleObject() { ID = 3, Value = 6, Name = "Name3", Category = "Catergory3"}); 
objList.Add(new SampleObject() { ID = 3, Value = 2, Name = "Name3", Category = "Catergory3"}); 

var newList = from val in objList 
       group val by new { val.ID, val.Name, val.Category } into grouped 
       select new SampleObject() { ID = grouped.ID, Value = grouped.Sum(), Name = grouped.Name, Category = grouped.Category }; 

проверить с LINQPad:

newList.Dump(); 
Смежные вопросы