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

高人 看看啊
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(...)

看贴要看全啊.

探讨

就如2楼所说,如果没有data1.count()我就没办法知道总的记录数了,那是不是执行这个count的时候,记录都已经读入内存了? 我分页的目的其实就是为了降低内存的消耗,要不然把几十万的记录都放到内存,占空间啊!


------解决方案--------------------
跳1200条,是什么意思?前面1200条数据满足 where p.时间 > lasttime && p.时间 < DateTime.Now 条件吗?
------解决方案--------------------
"因为数据量大"

开始我看到这个以为是100W以上...

如果一小时1200条,即使你全部读入到内存,也不会有什么问题.

而且我看你的Linq发现读取的栏位,字段都不是特大的那种.

探讨

没有啊,我也纳闷呢,我的数据时每3秒采一次 1小时就1200条,但是和我的条件没关系 啊

------解决方案--------------------
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条。