建议需要LINQ查询到DataTable

时间:2009-09-09 15:33:06

标签: c# linq

我想在我的数据库中找到顶级国家列表中的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

更新


在李的帮助下,我得到了以下查询工作,但在那个查询而不是 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"))
                    };

1 个答案:

答案 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")) } );