欢迎来到.NET绿叶网!

EntityFramework异常Win32Exception (0x80004005): 等待的操作过时。

2016-11-01 0x80004005 Win32Exception (0x80004005): 等待的操作过时。

使用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”了。这时再试就不会超时了。