Linq Group by

forum2621 2010-01-29 12:12:11
问题,我有一个DataTable,现要对其进行分组求和。(DataTable是通过其他方式得到的。目前不能操作数据库,如果能操作数据库就不用这么麻烦了)。
Title Module Language Num
A1 software1 French 1
A2 software1 French 2
A1 software1 German 3
A2 software1 German 4
A1 software2 French 5
A2 software2 French 6
A1 software2 German 7
A2 software2 German 8

按Title和Module分组,结果如下表:
Title Module sum_num
A1 software1 1+3=4
A2 software1 2+4=6
A1 software2 5+7=12
A2 software2 6+8=14


求Linq写法。


备注:Linq以前没学过,直接对DataTable不能groupby,刚刚知道Linq可以实现这个功能,望懂得给个代码吧,谢谢了。

...全文
388 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
forum2621 2010-02-02
  • 打赏
  • 举报
回复
搞定,结贴,感谢各位。
gghlkk 2010-01-29
  • 打赏
  • 举报
回复

sum_num = g.Sum(r => r.Field<Double?>("Num")??0);


Num列的类型是Double吧 可以不要再转int了
gghlkk 2010-01-29
  • 打赏
  • 举报
回复

sum_num = g.Sum(r => Convert.ToInt32(r.Field<Double?>("Num")??0);
qldsrx 2010-01-29
  • 打赏
  • 举报
回复
改成:
sum_num = g.Sum(r => Convert.ToInt32(r.Field<Double?>("Num").GetValueOrDefault(0))) 

话说Double也可以算数运算了,没必要转到Int32了。
forum2621 2010-01-29
  • 打赏
  • 举报
回复
先有个问题,空值在里边怎么处理?
如果为空值:
sum_num = g.Sum(r => Convert.ToInt32(r.Field<Double>("Num")))
就会报错:
System.InvalidCastException: Cannot cast DBNull.Value to type 'System.Double'. Please use a nullable type

如何处理,谢谢。
zhangyumei 2010-01-29
  • 打赏
  • 举报
回复
1楼手真快,想到一块了。
zhangyumei 2010-01-29
  • 打赏
  • 举报
回复
//引入的命名空间,linq只能在vs2005以后的版本,即vs2008/2010 上使用
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Data.Linq;

DataTable table = 你的DataTable;

//创建一个用于存放返回值的DataTable
DataTable dt = new DataTable("Test2");
dt.Columns.Add("Title", Type.GetType("System.String"));
dt.Columns.Add("Module", Type.GetType("System.String"));
dt.Columns.Add("Sum", Type.GetType("System.Int32"));
DataRow dr;

var result = from t in table.AsEnumerable()
group t by new { g1 = t.Field<string>("Title"), g2 = t.Field<string>("Module") }
into t2
select new
{
Title = t2.Key.g1,
Module = t2.Key.g2,
Sum_Num = t2.Sum(u => u.Field<int>("Num"))
};

foreach( var r in result)
{
if (r == null)
{
continue;
}
dr = dt.NewRow();

dr["Title"] = r.Title;
dr["Module"] = r.Module;
dr["Sum"] = r.Sum_Num;

dt.Rows.Add(dr);
}

以上代码,我在我本地已经测试过了,没有问题。
qldsrx 2010-01-29
  • 打赏
  • 举报
回复
参考第八楼回复。
forum2621 2010-01-29
  • 打赏
  • 举报
回复
果然厉害,多谢了。
gghlkk 2010-01-29
  • 打赏
  • 举报
回复

var result = from row in mTable.AsEnumerable()
group row by new
{
title = row.Field<string>("Title"),
module = row.Field<string>("Module")
} into g
select new
{
Title = g.Key.title,
Module = g.Key.module,
sum_num = g.Sum(r => Convert.ToInt32(r.Field<string>("Num")))
};

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧