2015-12-16 74 views
-3

我有一個List對象(超過250屬性的對象),我想做一個由兩列(字符串)組然後總結所有其餘(雙), 是有什麼解決辦法,以避免一個使之之一,並做到所有雙重屬性,Linq c#組/總結很多列

這份名單,我從XML文件中獲取它,而不是從數據庫中查詢

var xx = Data.MyList.GroupBy(grp => new MyObject() 
      { 
       Name = grp.Name, 
       Date = grp.Date, 

      }).Select(slt => new MyObject() 
      { 
       Name = slt.Key.Name, 
       Date = slt.Key.Date, 

       eq = slt.Sum(x=>x.eq), 
       eq1 = slt.Sum(x=>x.eq1), 
       eq2 = slt.Sum(x=>x.eq2), 
       eq3 = slt.Sum(x=>x.eq3), 
       . 
       . 
       . 
       eq250 = slt.Sum(x=>x.eq2505), 
       }).ToList(); 

感謝HimBromBeere這裏是解決方案

var grpBySub = Data.MyList.GroupBy(grp => new 
     { 
      grp.Name, 
      grp.Date, 
     }).Select(slt => new 
     { 
      slt.Key.Name, 
      slt.Key.Date, 
      Sums = typeof(MyObject).GetProperties().Where(y => 
       y.Name != "Name" && 
       y.Name != "Date" && 

       ).Select(p => new 
      { 
       p.Name, 
       Sum = slt.Sum(entity => ((double?)p.GetValue(entity, null))) 

      }).ToList() 

     }).ToList(); 
+5

發表一些代碼,並顯示您的嘗試。 –

+3

一個具有250個屬性的數據庫實體?聽起來很奇怪,也許你應該考慮規範你的數據結構? – HimBromBeere

+0

您的意思是根據兩列或兩列分別根據一列進行單獨的劃勾嗎? – Codor

回答

1

好吧,雖然它可能是壞的設計,一個實體有你可以使用反射來獲取屬性值,所以許多屬性,總結他們:

var properties = typeof(MyEntity).GetProperties().ToList(); 
myEntities.GroupBy(x => x.numerator) 
     .Select(x => new 
     { 
      Key = g.Key, 
      Sums = properties.Select(p => new 
      { 
       Name = p.Name, 
       Sum = g.Sum(entity => (int)p.GetValue(entity, null)) 
      }).ToList() 
     }).ToList(); 
+0

@ user3708197完全編輯我的答案。現在它應該工作 – HimBromBeere

+0

我可以得到我們輸出相同的列表類型我們的輸入列表 – user3708197

+0

你是什麼意思與輸入列表相同的類型?你的輸入根本沒有被發現,所以你的結果應該以任何方式嵌套。此外,如果你的意思是你需要一個可以工作的MyEntity列表。但是您必須手動將'MyEntity'的每個屬性賦值爲匿名類型中的相關值,例如'新的MyEntity {SumAttr3 = ...,SumAttr4 = ...}' – HimBromBeere

0

既然你在一個XML文檔做,你不不一定需要去反思。一個非常粗糙和粗糙的例子:

var xml = @"<root> 
       <element groupAttr1=""1"" groupAttr2=""2"" someAttr1=""1"" someAttr2=""2"" /> 
       <element groupAttr1=""1"" groupAttr2=""2"" someAttr1=""3"" someAttr2=""4"" /> 
      </root>"; 

var xDoc = XDocument.Parse(xml); 

var groupped = xDoc.Root 
        .Elements("element") 
        .GroupBy(el => new 
            { 
            GroupAttr1 = el.Attribute("groupAttr1")?.Value, 
            GroupAttr2 = el.Attribute("groupAttr2")?.Value 
            }) 
        .Select(x => new 
           { 
            Key = x.Key, 
            Sums = x.Select(
             el => el.Attributes() 
               .Where(a => a.Name != "groupAttr1" 
                 && a.Name != "groupAttr2") 
               .Sum(a => double.Parse(a.Value))) 
           });