雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

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个月前
赞一波!

文章评论

评论问答