EntityFramework异常Win32Exception (0x80004005): 等待的操作过时。
2024-10-17
21
使用EntityFramework生成的Sql语句,出现下列异常:
异常详细信息: System.ComponentModel.Win32Exception: 等待的操作过时。
代码如下:
query.Count = items.Count();
var result = items
.OrderByDescending(m => m.Id)
.Skip(query.Skip)
.Take(query.Take).ToArray();
意思是先把符合条件的记录总数查出来,再取分页数据。
调试得到了生成的sql语句,在sqlserver查询窗口执行后,速度挺快的。应该不是语句的性能问题。
后来发现是Count()的问题。Count()其实是.NET在内存里进行的,所以当执行Count()的时候等于把所有记录都查出来到内存里再进行Count(),数据量很大,可想而知会超时。
如果要让代码尽量去生成LINQ to SQL,有个很简单的原则,就是尽量用LINQ、Lambda表达式,这样EF才可能帮我们翻译。所以,在EF中,要进行Count操作,应该这样写:
query.Count = items.Count(x=>x.Id>0);
这时,Count()接受了一个lambda表达式,LINQ to SQL就能准确翻译为“SELECT COUNT”了。这时再试就不会超时了。
更新于:1个月前赞一波!
相关文章
文章评论
评论问答