[c#]转换数据表 GroupBy 多列以使用 Linq 的总和

标签: Linq DataTable C#
发布时间: 2017/2/28 21:34:00
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想总结的所有 TotalImages Column 后 Group BY,但其 ' 显示我错误。 任何人可以帮我究竟怎么了。 记住只是想从这种语法使用,并希望 DataTable 不是列表。请如果有人帮我出会很感激。

示例数据:-

CountryId | CItyId | TotalImages
1              1        2
1              2        2
1              2        3
1              3        4 
2              1        2
2              2        2
2              2        3
2              3        4 




DataTable dt = dt.AsEnumerable()
 .GroupBy(r => new { Col1 = r["CountryId"], Col2 = r["CityId"]})
 .Select(g => g.Sum(r => r["TotalImages"]).First())
 .CopyToDataTable();

enter image description here

解决方法 1:

您可以使用此:-

DataTable countriesTable = dt.AsEnumerable().GroupBy(x => new { CountryId = x.Field<int>("CountryId"), CityId = x.Field<int>("CityId") })
                             .Select(x => new Countries
                                          {
                                              CountryId = x.Key.CountryId,
                                              CityId = x.Key.CityId,
                                              TotalSum = x.Sum(z => z.Field<int>("TotalImages"))
                                          }).PropertiesToDataTable<Countries>();

我得到,之后输出:-

enter image description here

因为,我们不能使用 CopyToDataTable 方法为匿名类型,曾经扩展方法从这里拿,作出相应的修改。

public static DataTable PropertiesToDataTable<T>(this IEnumerable<T> source)
    {
        DataTable dt = new DataTable();
        var props = TypeDescriptor.GetProperties(typeof(T));
        foreach (PropertyDescriptor prop in props)
        {
            DataColumn dc = dt.Columns.Add(prop.Name, prop.PropertyType);
            dc.Caption = prop.DisplayName;
            dc.ReadOnly = prop.IsReadOnly;
        }
        foreach (T item in source)
        {
            DataRow dr = dt.NewRow();
            foreach (PropertyDescriptor prop in props)
            {
                dr[prop.Name] = prop.GetValue(item);
            }
            dt.Rows.Add(dr);
        }
        return dt;
    }

而且,这里是 Countries 类型:-

public class Countries 
{
    public int CountryId { get; set; }
    public int CityId { get; set; }
    public int TotalSum { get; set; }
}

可以使用任何其他方法,如果你希望将它转换到数据表中。

官方微信
官方QQ群
31647020