首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

高人 看看啊该怎么解决

2011-12-28 
高人 看看啊C# code var data1 from p in db.数据表swhere p.时间 lasttime && p.时间 DateTime.Now

高人 看看啊

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条。 


[解决办法]
foreach (var one in data)
//第一次遍历,首先初始化data,从数据库中 读取数据,加载到内存,one 就从内存中读。
//第二次遍历,还是从内存读,data也不会从数据库中再读取一次,已经在内存了。one的 作用域只限循环内。

热点排行