繁体   English   中英

LINQ查询到DataTable所需的建议

[英]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"))

            }
            );

更新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"))
                    };

给定一个数据表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM