【问题标题】:advice needed LINQ query to DataTable需要对 DataTable 的 LINQ 查询的建议
【发布时间】: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"))
                    };

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    给定一个数据表 dt,我认为这应该可行:

    dt.AsEnumerable()
                .GroupBy(row => Utils.GetCountryNameAndFlag(row.Field<string>("ip")))
                .Select(group => new { Country = group.Key, Count = group.Count() });
    

    编辑:响应您的 cmets - 由于 IGrouping 是 IEnumerable 您可以简单地从其中的任何值中获取国家名称。因此,您可以这样做以获得您想要的:

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

    【讨论】:

    • 谢谢。在您的帮助下,我设法做到了 ----- TopCountriesRepeater.DataSource = ds.Tables[1].AsEnumerable() .GroupBy(row => row.Field("CountryCode")) .Select(group = > 新 { CountryCode = group.Key, CountryName = group.Key, UsersFromIp = group.Sum(row => row.Field("UsersFromIp")) } ); ----- 但我也想从行中选择 CountryName。我怎样才能做到这一点?我敢肯定这很简单,但无法弄清楚
    • 而不是 CountryName = group.Key 我想选择行“CountryName”
    • 我得到 system.data.row 不包含 getField 错误的定义,但在您的帮助下,我能够得到我想要的。查看我的最后一次编辑
    • 对不起,应该是 Field 而不是 GetField
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2017-11-29
    相关资源
    最近更新 更多