【发布时间】:2009-09-09 15:33:05
【问题描述】:
我正在尝试从我的数据库中的 ips 列表中获取顶级国家/地区列表,使用 sql 查询我返回一个包含如下数据的数据表
IP IpCount
++++++++++++++++++++++
XXX.XXX.XX1 20
XXX.XXX.XX2 1
XXX.XXX.XX3 2
在数据绑定到中继器控件时,我使用 Maxmind Ip 到 Country db 来获取国家/地区名称
Utils.GetCountryNameAndFlag(Eval("ip").ToString())
如您所想,如果某些 IP 来自同一个国家/地区,我会在中继器控制中多次列出同一个国家/地区,例如
美国 - 3
美国 - 1
DE - 2
我想要实现的是对我的数据表进行查询以按国家/地区名称分组并添加来自该国家/地区的 IP 数量,因此结果将是
美国 - 4
德 - 2
我无法在 sql server 端执行此操作,因为我的函数从文件系统中的二进制文件中获取国家/地区名称(请参阅 http://www.maxmind.com/app/csharp)
更新:
在 Lee 的帮助下,我得到了下面的查询工作,但在那个查询中而不是 CountryName=group.Key 我想选择行“CountryName”
TopCountriesRepeater.DataSource = ds.Tables[1].AsEnumerable()
.GroupBy(row => row.Field<string>("CountryCode"))
.Select(group => new
{
CountryCode = group.Key,
CountryName = group.Key,
UsersFromIp = group.Sum(row => row.Field<int>("UsersFromIp"))
}
);
更新 2
我已经可以使用它了
var query = from row in ds.Tables[1].AsEnumerable()
group row by new
{
CountryCode = row.Field<string>("CountryCode"),
CountryName = row.Field<string>("CountryName")
}
into grp orderby grp.Sum(r => r.Field<int>("UsersFromIp")) descending
select new
{
CountryCode = grp.Key.CountryCode,
CountryName = grp.Key.CountryName,
UsersFromIp = grp.Sum(r => r.Field<int>("UsersFromIp"))
};
【问题讨论】: