[英]advice needed LINQ query to DataTable
我正在尝试从数据库中的ips列表中获取排名靠前的国家列表,使用sql查询,我返回的数据表包含如下数据
IP IpCount
+++++++++++++++++++
XXX.XXX.XX1 20
XXX.XXX.XX2 1
XXX.XXX.XX3 2
在数据上使用Maxmind Ip绑定到转发器控件im到Country db以获取国家名称
Utils.GetCountryNameAndFlag(EVAL( “IP”)。toString()方法)
就像您想像的那样,如果某些IP来自同一国家/地区,那么在转发器控制中,我会获得两次列出同一国家/地区的信息,例如
美国-3
美国-1
DE-2
我要达到的目的是对我的数据表进行查询,以按国家/地区名称分组并添加该国家/地区的IP数量,因此结果应该是
美国-4
德-2
我无法在sql服务器端执行此操作,因为我的函数从文件系统中的二进制文件获取国家/地区名称(请参见http://www.maxmind.com/app/csharp )
更新:
在李的帮助下,我得到了下面的查询,但是在该查询中,而不是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"))
}
);
我已经与
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"))
};
给定一个数据表dt,我认为这应该工作:
dt.AsEnumerable()
.GroupBy(row => Utils.GetCountryNameAndFlag(row.Field<string>("ip")))
.Select(group => new { Country = group.Key, Count = group.Count() });
编辑:作为对您的评论的回应-由于IGrouping是IEnumerable <DataRow>,因此您可以简单地从其中的任何值获取国家/地区名称。 因此,您可以执行以下操作以获取所需的内容:
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")) } );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.