2012-01-18 29 views
0

我有數據表:LINQ到Swap幾列到數據表的行用C#

location Quarter ppl_required ppl_available 
BLR   Q1  70    35 
BLR   Q2  50    45 
BLR   Q3  25    28 
BLR   Q4  60    58 
CHN   Q1  77    92 
CHN   Q2  42    66 
CHN   Q3  29    20 
CHN   Q4  22    24 

有沒有更好的方式來獲得下面的數據表作爲輸出非常簡單或短期的方式[沒有循環 ]使用LINQ或使用.NET3.5/4.0/4.5框架的高級功能LINQ

Location ppl_Required_Q1 ppl_Required_Q2 ppl_Required_Q3 ppl_Required_Q4 ppl_available_Q1 ppl_available_Q2 ppl_available_Q3 ppl_available_Q4 
BLR  70    50    25    60    35    45    28    58 
CHN  77    42    29    22    92    66    20    24 
+0

爲什麼更好的方式?你已經做到了。嚴重:比什麼好?顯示你先試過的東西。 – 2012-01-18 21:58:32

回答

0

我不知道你已經嘗試一下,如果有任何效率或靈活性的需求,或者你真的需要一個出口容器,但也許這樣簡單的東西是有用的。假設dt是你的數據表:

var newSet = dt.AsEnumerable() 
       .GroupBy(r => r.Field<string>("Location")) 
       .Select(g => new 
       { 
        Location = g.Key, 
        ppl_required_Q1 = g.Where(p => p.Field<string>("Quarter") == "Q1").Sum(p => p.Field<int>("ppl_required")), 
        ppl_required_Q2 = g.Where(p => p.Field<string>("Quarter") == "Q2").Sum(p => p.Field<int>("ppl_required")), 
        ppl_required_Q3 = g.Where(p => p.Field<string>("Quarter") == "Q3").Sum(p => p.Field<int>("ppl_required")), 
        ppl_required_Q4 = g.Where(p => p.Field<string>("Quarter") == "Q4").Sum(p => p.Field<int>("ppl_required")), 
        ppl_available_Q1 = g.Where(p => p.Field<string>("Quarter") == "Q1").Sum(p => p.Field<int>("ppl_available")), 
        ppl_available_Q2 = g.Where(p => p.Field<string>("Quarter") == "Q2").Sum(p => p.Field<int>("ppl_available")), 
        ppl_available_Q3 = g.Where(p => p.Field<string>("Quarter") == "Q3").Sum(p => p.Field<int>("ppl_available")), 
        ppl_available_Q4 = g.Where(p => p.Field<string>("Quarter") == "Q4").Sum(p => p.Field<int>("ppl_available")), 
       }); 

編輯

添加來自實例herehere在鏈接的情況下,未來會出現問題組裝的擴展方法。您應該可以根據需要進行修改。

public static DataTable ToDataTable<T>(this IEnumerable<T> source, string newTableName) 
{ 
    DataTable newTable = new DataTable(newTableName); 

    T firstRow = source.FirstOrDefault(); 
    if (firstRow != null) 
    { 
     PropertyInfo[] properties = firstRow.GetType().GetProperties(); 
     foreach (PropertyInfo prop in properties) 
     { 
      newTable.Columns.Add(prop.Name, prop.PropertyType); 
     } 

     foreach (T element in source) 
     { 
      DataRow newRow = newTable.NewRow(); 
      foreach (PropertyInfo prop in properties) 
      { 
       newRow[prop.Name] = prop.GetValue(element, null); 
      } 
      newTable.Rows.Add(newRow); 
     } 
    } 
    return newTable; 
} 
+0

如何分配/存儲'newset'數據的結果到一個新的數據表? – venkat 2012-01-19 04:36:02

+0

有沒有辦法直接將結果'newset'綁定到另一個新的DataTable? – venkat 2012-01-19 04:46:31

+0

您應該可以爲此使用擴展方法。考慮ToDataTable示例[這裏](http://unboxedsolutions.com/sean/archive/2009/06/06/15961.aspx)和[here](http://www.extensionmethod.net/Details.aspx?ID = 249)。 – 2012-01-19 15:52:32

1

我創建了一個類似的數據結構,你在LINQPad描述了這樣的代碼,我有

void Main() 
{ 
    List<Location> locations = new List<Location> 
    { 
     new Location { Key = "BLR", Quarter = "Q1", PeopleRequired = 70, PeopleAvailable = 35 }, 
     new Location { Key = "BLR", Quarter = "Q2", PeopleRequired = 50, PeopleAvailable = 45 }, 
     new Location { Key = "BLR", Quarter = "Q3", PeopleRequired = 25, PeopleAvailable = 28 }, 
     new Location { Key = "BLR", Quarter = "Q4", PeopleRequired = 60, PeopleAvailable = 58 }, 
     new Location { Key = "CHN", Quarter = "Q1", PeopleRequired = 77, PeopleAvailable = 92 }, 
     new Location { Key = "CHN", Quarter = "Q2", PeopleRequired = 42, PeopleAvailable = 66 }, 
     new Location { Key = "CHN", Quarter = "Q3", PeopleRequired = 29, PeopleAvailable = 20 }, 
     new Location { Key = "CHN", Quarter = "Q4", PeopleRequired = 22, PeopleAvailable = 24 }, 
     new Location { Key = "CAD", Quarter = "Q1", PeopleRequired = 100, PeopleAvailable = 150 }, 
     new Location { Key = "CAD", Quarter = "Q2", PeopleRequired = 200, PeopleAvailable = 250 }, 
    }; 

    var results = 
    (
     from loc in locations.Select(l => new { l.Key }).Distinct() 
     join q1 in locations.Where(l => l.Quarter == "Q1") on loc.Key equals q1.Key into quarter1 
     join q2 in locations.Where(l => l.Quarter == "Q2") on loc.Key equals q2.Key into quarter2 
     join q3 in locations.Where(l => l.Quarter == "Q3") on loc.Key equals q3.Key into quarter3 
     join q4 in locations.Where(l => l.Quarter == "Q4") on loc.Key equals q4.Key into quarter4 
     from q1 in quarter1.DefaultIfEmpty() 
     from q2 in quarter2.DefaultIfEmpty() 
     from q3 in quarter3.DefaultIfEmpty() 
     from q4 in quarter4.DefaultIfEmpty() 
     select new 
     { 
     loc.Key, 
     Q1_PeopleRequired = q1 != null ? q1.PeopleRequired : -1, 
     Q1_PeopleAvailable = q1 != null ? q1.PeopleAvailable : -1, 
     Q2_PeopleRequired = q2 != null ? q2.PeopleRequired : -1, 
     Q2_PeopleAvailable = q2 != null ? q2.PeopleAvailable : -1, 
     Q3_PeopleRequired = q3 != null ? q3.PeopleRequired : -1, 
     Q3_PeopleAvailable = q3 != null ? q3.PeopleAvailable : -1, 
     Q4_PeopleRequired = q4 != null ? q4.PeopleRequired : -1, 
     Q4_PeopleAvailable = q4 != null ? q4.PeopleAvailable : -1 
     } 
    ); 

    results.Dump(); 
} 

// Define other methods and classes here 
public class Location 
{ 
    public string Key   { get; set; } 
    public string Quarter  { get; set; } 
    public int PeopleRequired { get; set; } 
    public int PeopleAvailable { get; set; } 
} 

,我結束了是你要找的結果。這可能是或不是最好的方式,我在一張大桌子上製造滯後,但它的工作:)

Key | Q1_PeopleRequired | Q1_PeopleAvailable | Q2_PeopleRequired | Q2_PeopleAvailable | Q3_PeopleRequired | Q3_PeopleAvailable | Q4_PeopleRequired | Q4_PeopleAvailable 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
BLR | 70    | 35     | 50    | 45     | 25    | 28     | 60    | 58 
CHN | 77    | 92     | 42    | 66     | 29    | 20     | 22    | 24 
CAD | 100    | 150    | 200    | 250    | -1    | -1     | -1    | -1