2015-06-06 19 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分,谢谢你:) –