日期:2014-05-17  浏览次数:20424 次

Linq分组查询,然后求某列的和
2个都是在执行 int use = .....这句的时候慢。
数据有最大有几百万条,但是现在blists里只有几万条的数据,查询速度就很慢了。这个有办法优化吗?
下面2种写法有没有区别?如果有那个执行效率较好(不考虑别的,只考虑得到use的结果)
C# code

var blist = from p in blists
                    group p by new { p.roleid,p.oper_type} into g
                    select new { g.Key.oper_type, sum_gold = g.Sum(p => p.gold), sum_coupon = g.Sum(p => p.coupon), sum_copper = g.Sum(p => p.copper) };

int use = blist.Where(p => p.oper_type == 1).Sum(p => p.sum_gold);

/////////////////////////////////////////////////
var blist = from p in blists
                    group p by p.oper_type into g
                    select new { g.Key, sum_gold = g.Sum(p => p.gold), sum_coupon = g.Sum(p => p.coupon), sum_copper = g.Sum(p => p.copper) };

int use = blist.SingleOrDefault(p => p.oper_type == 1).sum_gold;



------解决方案--------------------
没什么区别,
你两种方法都使用了 Sum 等类似这样的非延迟查询操作符
会导致查询立即执行去操作内存中的数据
------解决方案--------------------
优化数据库吧
------解决方案--------------------
一般这种比较暴力的玩意不是用查询来解决的
搞个专门的记录来记吧……
没插一条数据 顺便更新一下那条记录(用触发器还是逻辑代码里面的事件随你高兴)
用的时候直接读那条数据
------解决方案--------------------
如果是linq to objects,可以试试plinq(并行linq)。
------解决方案--------------------
换种方式,这样非延迟,太慢了
------解决方案--------------------
在sql中看看有没有什么比较好的优化方法