讨论用LINQ如何查重以及用纵横表显示数据

 

问题和要求如下:

 

 有数据表如下:

IDOwnerResourceOrderIDQuotation
1JackChina36345
2JackChina36345
3MikeJapan67823
4MikeJapan67823
5MikeJapan67823
6JohnChina89312
7JohnKorea45311
8MikeChina23478
9JackChina67633
10MikeJapan45425

首先根据查重Owner, Resource, OrderID, Quotation,去掉重复订单(但是需要保留其中任意一个ID号)

IDOwnerResourceOrderIDQuotation
1JackChina36345
3MikeJapan67823
6JohnChina89312
7JohnKorea45311
8MikeChina23478
9JackChina67633
10MikeJapan45425

 

然后用二重分组Owner, Resource,来分组统计Quotation合计数量。用纵横表显示结果,左边第一行是人名,顶部行显示来源。

 ChinaKoreaJapan
Jack7800
John12110
Mike78048

 

这个问题折磨了我好几天还是没有解决,我下面的解决方法属于变通的方法,欢迎大家批评指正,也请高手发表你的改进方法。

 

查重,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()

}

 

结果显示出来的还不是纵横表,但是方法比较简单。

有高手看了,发表一下你的意见,看看我是不是没走对方向?


转载于:https://www.cnblogs.com/xblues/archive/2008/08/21/1273362.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值