使用微软.net的孩子们应该都知道linq吧,要知道linq可是其他高级语言没有的技术,比如php,java等等,但是起初我对linq的认识只是停留在对 list<> 的泛型集合进行操作,要知道操作数据库的,我们比较容易得到的是 datatable,而得到 list<>集合的性能会降低,很多情况下,我们需要对我们的datatable进行操作,很多想到了的对datatable进行逐行或者 逐列进行遍历,但是如果要对datatable进行分组 那就没有办法了,在找了很多资料之后,我发现很多 提供的linq的操作 datatable 是错的,所以我希望把我研究后的datatable的使用linq的方法分享下!!!!!
在我研究了近两天后,终于找到了 不会报错的linq操作的 分组了!!!
//接下来我们得到一个sql语句,jobdate工作时间(datetime数据类型)UserName(string数据类型)
//我们通过sql语句得到我们 查询表UserLogin所有的记录了
DataTable dt = GetData<DataBase.MyoA>.getTableBysql("select * from UserLogin");
//接下来我们要对datatable进行分组,我们可以这样理解
//要知道datatable 由row组成,(一个表由多个行组成)
//当让我们要知道datatable需要使用AsEnumerable()的方法才能遍历
var grouped2 = from row in dt.AsEnumerable()
orderby row["jobdate"] ascending // 我们获得其中一列的方法类似
//下面我们要进行分组,因为分组之后我们就已经不是datatable ,而是一个我们
//所需要的一组集合,分组后我们变成了valueGroup
group row by new { UserName = row["UserName"] } into valueGroup
//下面我们可以对分组后的数据进行取最大值,获得进行统计
select new { username = valueGroup.Key.UserName, Value = valueGroup.Key,
jobdate = valueGroup.Max(jobdate => jobdate["jobdate"]), count = valueGroup.Count() };
这个时候我们要需要对转化成datatable怎么办呢?
// 首先我们要建立与他们对应的 datatable,然后我们来进行遍历
DataTable dt2=new DataTable();
dt2.Columns.Add("username",typeof(System.String));
dt2.Columns.Add("jobdate",typeof(System.DateTime));
foreach (var ig in grouped2)
{
DataRow dr = dt2.NewRow();
dr["username"] = ig.username; //这个是对得到了集合进行取值的方法
dr["jobdate"] = ig.jobdate;
dt2.Rows.Add(dr);
}
网上我看到了很多对 datatable进行分组操作的例子,但是绝大多数的操作都是错的,就是会报错,只有这个才是会不会报错了。
本人QQ地址: http://user.qzone.qq.com/379069296/infocenter?ptsig=kRNgg5eaVPb57J3v5FxtpOiagwiYQg9vkSG871RxjCE_