Linq 查询 return 国家/地区作为列,城市作为行并在单元格中计数
Linq query to return country as column and cities as rows and count in cells
我在数据库中有这个 table :
| 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(),
};
但这不是我想要的:/
如果您想从数据库 table 创建一个 "pivot table" 来绑定到网格视图,我知道的最简单的方法是使用 DataTable
作为绑定源并使用 LINQ 查询获取信息来填充它。
所以我们基本上需要将 "City" 列的唯一行值转换为新数据透视数据 table 的列。我们可以通过几种方式来做到这一点,但每一种方式都需要一些步骤。下面的示例显示了一种只需要对数据库进行一次查询就可以检索我们需要的数据的方法。
// 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);
}
我在数据库中有这个 table :
| 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(),
};
但这不是我想要的:/
如果您想从数据库 table 创建一个 "pivot table" 来绑定到网格视图,我知道的最简单的方法是使用 DataTable
作为绑定源并使用 LINQ 查询获取信息来填充它。
所以我们基本上需要将 "City" 列的唯一行值转换为新数据透视数据 table 的列。我们可以通过几种方式来做到这一点,但每一种方式都需要一些步骤。下面的示例显示了一种只需要对数据库进行一次查询就可以检索我们需要的数据的方法。
// 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);
}