讨论用LINQ如何查重以及用纵横表显示数据
问题和要求如下:
有数据表如下:
ID | Owner | Resource | OrderID | Quotation |
1 | Jack | China | 363 | 45 |
2 | Jack | China | 363 | 45 |
3 | Mike | Japan | 678 | 23 |
4 | Mike | Japan | 678 | 23 |
5 | Mike | Japan | 678 | 23 |
6 | John | China | 893 | 12 |
7 | John | Korea | 453 | 11 |
8 | Mike | China | 234 | 78 |
9 | Jack | China | 676 | 33 |
10 | Mike | Japan | 454 | 25 |
首先根据查重Owner, Resource, OrderID, Quotation,去掉重复订单(但是需要保留其中任意一个ID号)
ID | Owner | Resource | OrderID | Quotation |
1 | Jack | China | 363 | 45 |
3 | Mike | Japan | 678 | 23 |
6 | John | China | 893 | 12 |
7 | John | Korea | 453 | 11 |
8 | Mike | China | 234 | 78 |
9 | Jack | China | 676 | 33 |
10 | Mike | Japan | 454 | 25 |
然后用二重分组Owner, Resource,来分组统计Quotation合计数量。用纵横表显示结果,左边第一行是人名,顶部行显示来源。
China | Korea | Japan | |
Jack | 78 | 0 | 0 |
John | 12 | 11 | 0 |
Mike | 78 | 0 | 48 |
这个问题折磨了我好几天还是没有解决,我下面的解决方法属于变通的方法,欢迎大家批评指正,也请高手发表你的改进方法。
查重,Linq使用Distinct方法,但是这个Distinct方法实际上不支持任何参数。
var result = (from r in SampleTable
select new { r.Owner, r.Resource, r.OrderID, r.Quotation}
).Distinct().ToList();
这样得到了出去重复订单的记录集,可是并不符合题目要求,因为题目要求保留重复记录的任意一个ID。
所以再用一遍Linq的join功能,的Join功能把ID按条件匹配出来。这样我就用了两步,不知道有没有方法可以一步完成。
具体写法,等我再看看。到目前为止其实是为了完成第二个要求做了准备工作,查重了。
我开始使用嵌套group by写了一个linq语句,
var result2 = from s in reslut
group s by s.Owner into groupA
select new {
Name = groupA.Key,
NewData = from t in groupA
group t by t.Resource into groupB
select new {
Resource = groupB.Key
Amount = groupB.Quatation.Sum()}
}
通过两个group by 的嵌套生成了一个嵌套结构的数据集,可以采用主总表的方式显示到页面。
具体方法可以采用两个ListView 嵌套,在外层的ListView的datasource里指定为result2,
增加一个数据绑定的时候变化内层ListView的数据源的事件,微软的帮助也是这样写的,原理上可以实现,但是已经看得我头大了!
又google了一下,发现原来我不需要用这个嵌套Group by的,其实我先用一个group by,查询出来一个数据集,使用ListView显示,然后再外层ListView里面定义一个Group By,就等于把内嵌的group by写到了前端界面控件里了,这样内嵌的ListView会自然切换数据集。这个方法看似简单。缺点是,使用了前端空间完成了嵌套逻辑。具体可以参考,Matt Berseth的博客文章,
http://mattberseth.com/blog/2008/01/building_a_grouping_grid_with.html
问题又来了,我的要求是纵横表,可是这样一天套等于一个纵表内,嵌套的表还是纵向排列的。找了好多资料都不得其解。
记得原来,我用SQL语句只要用多个字段group by一下,就可以了,现在使用linq却要嵌套group by才行!
而且查询出来的嵌套结构的结构显示起来极其不方便,简直是太难了。
原来用SQL我可以这样写:
select Owner, Resource, Sum(Quotation) from Table
groupby Owner, Resource
查询出来的结果我可以直接显示,因为不是嵌套结构。
即使是嵌套结构的查询结果,按着传统的ASP方法,或者新的MVC方法,我都可以直接用<%=%>输出,现在表单方式的ASP.NET我却必须要找一个页面控件,太复杂了。
不行,接着找,看看Linq是不是可以支持多列groupby。终于找到了这个澳大利亚人的博客,
http://ddkonline.blogspot.com/2008/04/linq-group-by-syntax-for-grouping-on.html
可以这样写,
var result3 = from c in Table
group c by new {c.Owner, c.Resource} into groupC
select new {
Name = groupC.Key.Owner,
Country = groupC.Key.Resource
Amount = groupC.Count()
}
结果显示出来的还不是纵横表,但是方法比较简单。
有高手看了,发表一下你的意见,看看我是不是没走对方向?