日期:2014-05-20  浏览次数:20804 次

Code First 通过select 返回IQueryable后 foreach 非常非常慢
环境: MySQL , EF4.1 

语句如下:


var datas = from data in MyDataContext.Datas select data;

foreach( var data in datas )
{
continue;
}


即使这样速度也非常缓慢,100K的数据需要10秒。
这是怎么回事?
谢谢
------解决方案--------------------
数据量有多大?

foreach遍历想要达到什么目的? 简单的逻辑处理可直接放在select里处理
------解决方案--------------------
一开始是有点慢,还是说说你的需求吧
看能不能优化
------解决方案--------------------
你用sql profiler跟踪一下在实际数据库里的sql语句。
------解决方案--------------------
楼主用的是LINQ to SQL吗?
LINQ to SQL是不支持MySQL的。可以考虑用Entity Framework。运行速度也比LINQ to SQL要快。

http://blog.csdn.net/jfchef/article/details/7632872
------解决方案--------------------
为什么要在内存里遍历100K的数据?IQueryable本来就是生成数据库端的sql查询用的,for each就成了LINQ to Object了……
------解决方案--------------------
引用:
为什么要在内存里遍历100K的数据?IQueryable本来就是生成数据库端的sql查询用的,for each就成了LINQ to Object了……

同意!

lz慢的,在于传输速度。根本不是查询出数据的速度。这就好像说去买鞋的人号称不知道自己的脚的尺寸,偏要把鞋店所有的鞋都试一遍才知道自己的脚的大小。他为什么不把自己的脚的大小先告知给营业员呢?
------解决方案--------------------
引用:
回答各位哈。
用的是Entity Framework 中的Code First
然后用LINQ 做查询
MyDataContext 是 DbContext的派生类。

问题解决了一般。
我本来的数据 column 数目大概有 30 , 当我指定返回若干 column 后,速度有了非常巨大的改观。
MyDataContext.Datas.Select( t=>new{ column1 ……


你还应该提高几百倍速度。或者,你根本没有认真测试。
------解决方案--------------------
引用:
引用:

数据量有多大?

foreach遍历想要达到什么目的? 简单的逻辑处理可直接放在select里处理


把数据分发给下层。
比如传送给client

分发数据,直接用select进行筛选分发
------解决方案--------------------
是的。。。linq foreach非常慢,要比sql语句查出来的慢几秒,我试过了,,,奶奶的,我也不知道什么原因。。使用Linq,一页显示20条,itemdatabind里面也绑定数据的,要5秒左右,而sql要2秒!