高人 看看啊
- C# code
var data1 = from p in db.数据表s where p.时间 > lasttime && p.时间 < DateTime.Now//将新导入的记录导出来。 orderby p.编号 ascending select p; total = data1.Count();//获取记录的条数 if (total > 0) { int i = 0, totalbyhour = 0; while (has) { var data = data1.Take(2); //skipp = skipp + 10; foreach (var one in data) { while (!String.Equals(one.时间.ToString("MM/dd/yyyy/HH"), lasttime.ToString("MM/dd/yyyy/HH")))//不为同一时间段时,将上个时间段统计的数据写入库中。 { string temp = lasttime.ToString("MM/dd/yyyy/HH"); dr.InsertRecordByTime(yinshua, huanm, Convert.ToDateTime(temp)); lasttime = lasttime.AddHours(1); yinshua = 0; huanm = 0; totalbyhour = 0; } totalbyhour++; //为同一时间段时,对相应的参数累加。 if (one.温度2 > 30 && one.线速度 > 180) yinshua++; i++;//计数器,记录已经处理过的数据条数。 if (i == total)//将最后一数据写入数据库,下次统计时。利用其时间等参数。 { dc.UpdateCalculate(one.时间, yinshua, huanm); has = false; } } }这是我写的一段代码,因为数据量大,所以我想分页处理每段数据,但如上,我用data=data1.take(2)初次取是成功的,但当我第二次取的时候怎么直接就跳了1200.我没有用skip(),而且加了skip()的话 不过skip多少,等take的时候,还是跃过1200条,不知是何因啊,是不是var data = data1.Take(2);不能这样用啊??
[解决办法]
楼主这样写不仅不能达到分页处理每段数据的效果,而且是加重了查询效能的消耗.
Linq一个特性就是延迟查询
你这个查询没有用到这个特性
在这一句-->total = data1.Count(); 实际上就已经将整个查询结果加载到了内存.
下面那些分页啊,计算啊,都是徒劳的了.
真正想要分页查询,就要直接对查询的Linq语句做文章
- C# code
var data1 = (from p in db.数据表s where p.时间 > lasttime && p.时间 < DateTime.Now orderby p.编号 ascending select p).Skip((PageSize -1)* PageSize).Take(PageSize);
[解决办法]
data1.Count(); 生成 select count(*) 的sql文,速度应该是很快的。要不然总页数没法算了。
问题是你这里还是每一条数据都要处理,分不分页意义不大啊。
[解决办法]
count() 是非延迟查询操作符
会将DB中数据读入内存
[解决办法]
看我帖子后半段的Skip(...).Take(...)
看贴要看全啊.
[解决办法]
跳1200条,是什么意思?前面1200条数据满足 where p.时间 > lasttime && p.时间 < DateTime.Now 条件吗?
[解决办法]
"因为数据量大"
开始我看到这个以为是100W以上...
如果一小时1200条,即使你全部读入到内存,也不会有什么问题.
而且我看你的Linq发现读取的栏位,字段都不是特大的那种.
[解决办法]
- C# code
1、 total = data1.Count();//获取记录的条数 //执行一条 select count(*) as value from ...这条语句,其它数据并没有加载到内存。2、 var data = data1.Take(2); foreach (var one in data) //使用时 执行查询//第1次和 第2次 生成的sql语句一样: select top 2 * from ....。都是从数据库查询,不是从内存中//怎么叫 跳过1200条, 注意你的 orderby p.编号 ascending 倒序,再取2条。
[解决办法]
foreach (var one in data)
//第一次遍历,首先初始化data,从数据库中 读取数据,加载到内存,one 就从内存中读。
//第二次遍历,还是从内存读,data也不会从数据库中再读取一次,已经在内存了。one的 作用域只限循环内。