2015-06-06 16 views
2

我在數據庫有此表計數:Linq查詢返回的國家作爲柱,城市爲列,並在細胞

| Buyer Country| City |... 
|:-------------|-------:|... 
| Uk   | Lisbon |... 
| Portugal  | London |... 
| France  | Madrid |... 
| France  | Lisbon |... 
| France  | Madrid |... 
| France  | Madrid |... 

,我希望得到一個LINQ查詢,可以給我這個信息,以便我可以像這樣將數據網格綁定它:

| Buyer Country| Madrid | Lisbon | London | 
|:-------------|-------:|-------:|-------:| 
| Uk   | 0 | 1 | 0 | 
| Portugal  | 1 | 0 | 1 | 
| France  | 3 | 1 | 0 | 

國家和城市是動態的,我不能手動創建它們。 基本上我想獲得第一排所有買家國家的名單以及該國按城市列的形式在該城市購買的次數。

我得到的最好的是這樣的:

  var query = from purchase in db.TotalPurchases 
        group purchase by new { purchase.Country, purchase.City } into grp 
        select new 
        { 
         country = grp.Key.Country, 
         city = grp.Key.City, 
         count = grp.Count(), 
        }; 

但是,這並不完全是我想要的:/

+0

爲什麼不呢?你只需要添加條目到那些在db中沒有的(國家,城市)對的結果中,對不對? – Alioza

+0

對不起,我錯過了與數據網格綁定的部分。 – Alioza

+0

是啊:/我知道我有我所有的信息,但我想直接綁定這個查詢與數據網格,它應該是一種方法來實現這個權利?或者,也許我只是想這是錯誤的方式... –

回答

0

如果你想從綁定到你的數據庫表中創建一個「數據透視表」網格視圖,我知道的最簡單的方法是使用DataTable作爲綁定源,並使用LINQ查詢來獲取信息以填充它。

因此,我們基本上需要將「城市」列的唯一行值轉換爲新透視數據表的列。我們可以通過幾種方式做到這一點,但每個方法都需要一些步驟。下面的示例顯示了一種方法,只需要對數據庫進行單個查詢即可檢索我們需要的數據。

// 1. Query for all data we need 
var pivotInput = db.TotalPurchases 
    .GroupBy(p => p.Country) 
    .Select(cp => new { 
      Country = cp.Key, 
      PurchasesByCity = cp.GroupBy(x => x.City).Select(c => new { 
       City = c.Key, 
       NumberOfPurchases = c.Count() 
      }) 
     }).ToList(); 

// 2. Get all distinct cities 
var allCities = pivotInput 
    .SelectMany(x => x.PurchasesByCity.Select(c => c.City)) 
    .Distinct().ToList(); 

// 3. Build the pivot data table "schema". 
var pivotTable = new DataTable("purchasesByCity"); 
pivotTable.Columns.Add(new DataColumn("Country", typeof(string))); 
allCities.ForEach(c => pivotTable.Columns.Add(new DataColumn(c, typeof(int)))); 

// 4. Add as rows to the datatable 
foreach (var c in pivotInput) 
{ 
    var row = pivotTable.NewRow(); 
    row["Country"] = c.Country; 
    foreach (var city in c.PurchasesByCity) 
     row[city.City] = city.NumberOfPurchases; 
    pivotTable.Rows.Add(row); 
} 
+0

謝謝亞歷克斯和約瑟夫加利亞多,亞歷克斯你救了我很多時間尋找如何做到這一點,我深深感謝你的答案:)。因爲我們從數據庫獲得的查詢已經將數據按城市和國家進行了整理,所以Alex這個代碼可以很好地擴展,如果我的表擁有大量數據,那麼我的內存使用量將取決於多少不同的城市,我對我的數據庫正確?我想投你的答案,但還沒有15分,謝謝你:) –