C# Linq查询以列形式返回国家,以行形式返回城市,并在单元格中计数

C# Linq查询以列形式返回国家,以行形式返回城市,并在单元格中计数,c#,sql,linq,binding,datagrid,C#,Sql,Linq,Binding,Datagrid,我有一张db格式的表格: | Buyer Country| City |... |:-------------|-------:|... | Uk | Lisbon |... | Portugal | London |... | France | Madrid |... | France | Lisbon |... | France | Madrid |... | France | Madrid |..

我有一张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(),
                    };
但这并不是我想要的:/

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

因此,我们基本上需要将“City”列的唯一行值转换为新pivot数据表的列。我们可以用几种方法来实现这一点,但每种方法都需要一些步骤。下面的示例展示了一种只需对数据库进行一次查询即可检索所需数据的方法

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

为什么不呢?您只需要为数据库中找不到的(国家/地区、城市)对结果添加条目,不是吗?抱歉,我错过了与数据网格绑定的部分。是:/I我知道我所有的信息都是这样,但我想将此查询直接与数据网格绑定,这应该是实现这一点的一种方法吧?或者我只是想用错误的方式…在我看来,你想要一个经典的交叉表查询。搜索LINQ中的交叉表,您应该可以找到一些如何做的示例。感谢Alex和Joseph Gagliardo,Alex您为我节省了很多时间搜索如何做,我非常感谢您的回答:)。Alex如果我的表有大量的数据,那么这段代码的伸缩性会很好,因为我们从数据库中得到的查询已经有了按城市和国家分类的数据,所以我这边的内存使用情况将取决于我在数据库中有多少个不同的城市,对吗?我想投票支持你的答案,但还没有15分,谢谢:)