net里使用linq语句碰到的问题

来源:互联网 发布:手机淘宝秒杀在哪 编辑:程序博客网 时间:2024/06/08 18:08

背景: 我们的数据库使用了fluent nhibernate ,在C#中运用linq to sql 跟数据库交互。


今天早晨发现一个ajax请求需要4秒才能得到回应,这个请求只是在一个表里更新一行,虽然这个表有上万条数据,但我觉得花4秒也太多了。

于是找了个工具,nhibernate profiler(百度破解版),这个工具可以侦测一个http请求需要多少个数据库交互,以及每个交互用了多少时间。具体使用方法请百度之。

http://www.cnblogs.com/GaoHuhu/archive/2012/06/25/2562781.html

用了这个工具以后找到了原因。


问题及原因:

我们使用的时候是这样的: 

先调用 var listItems = System.Linq.IQueryable.select(t=>t).toList();  (这个是linq语句,此句代码要执行1秒左右,返回数以千记的items)

再调用 var result =  listItems.skip(n).take(m) (注意这个就不是linq了,这个是.net的查询,也需要花点时间)


正确方法:

var res = System.Linq.IQueryable.Where(whereCondition).OrderByDescending(keySelector1).Skip(skip).Take(take).ToList();  (这个完全是linq语句,只要执行十几毫秒)


类似的代码还有,这样也是第一步是linq语句,第二步是net查询,相当耗费时间:

var listItems = System.Linq.IQueryable.select(t=>t).toList();  

return (from news in listItems where news.Id == id ).FirstOrDefault();


再看下面,跟上面的代码我感觉是等价的,所以慢啊:

var listItems = System.Linq.IQueryable.select(t=>t).toList(); 

foreach (var newse in listItems )
            {
                if (newse.Id != id) 
                    continue;

                Delete(newse);
                return true;
            }


总结: 尽量用linq语句直接告诉数据库做什么查询。而不是从数据库拿出所有数据后在.net里再操作



0 0
原创粉丝点击