Linq查询将国家/地区作为列,将城市作为行返回并计入单元格

时间:2015-06-06 17:09:55

标签: c# sql linq binding datagrid

我在db中有这个表:

| 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(),
                    };

但这不是我想要的:/

1 个答案:

答案 0 :(得分:0)

如果您想创建一个"数据透视表"从您的数据库表绑定到网格视图,我所知道的最简单的方法是使用DataTable作为绑定源,并使用LINQ查询来获取填充它的信息。

所以我们基本上需要为" City"转换唯一的行值。列成新数据透视表数据列的列。我们可以通过几种方式实现这一目标,但每种方法都需要许多步骤。下面的示例显示了一种只需要对数据库进行单个查询即可检索所需数据的方法。

// 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);
}