我想在我的数据库中找到顶级国家列表中的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
De - 2
我无法在sql server端执行此操作,因为我的函数从文件系统中的二进制文件获取国家/地区名称(请参阅http://www.maxmind.com/app/csharp)
更新
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"))
}
);
我已经使用了
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"))
};
答案 0 :(得分:2)
鉴于数据表dt,我认为这应该有效:
dt.AsEnumerable()
.GroupBy(row => Utils.GetCountryNameAndFlag(row.Field<string>("ip")))
.Select(group => new { Country = group.Key, Count = group.Count() });
编辑:回应你的评论 - 因为IGrouping是一个IEnumerable&lt; DataRow&gt;您只需从其中的任何值中获取国家/地区名称即可。因此,您可以这样做以获得您想要的东西:
TopCountriesRepeater.DataSource = ds.Tables[1]
.AsEnumerable()
.GroupBy(row => row.Field<string>("CountryCode"))
.Select(group => new { CountryCode = group.Key, CountryName = group.First().Field<string>("CountryName"), UsersFromIp = group.Sum(row => row.Field<int>("UsersFromId")) } );