奇怪的lambda Expression打破了IIS

时间:2013-11-13 13:00:14

标签: c# entity-framework lambda iqueryable

我在IQueryable<T>上使用Entity.DbSet进行查询。当我插入这行代码时:

query = 
     query.Where(x => x.VersionInt == query.Max(y => y.VersionInt))

当我使用此行编译和运行时,整个IIS都会崩溃。如果我删除它一切都很好。发生了什么事?

2 个答案:

答案 0 :(得分:2)

堆栈溢出异常(这会使进程崩溃 - 你无法捕获StackOverflowException)!

Linq懒得评价。因此,您的查询正在查询自己。

你的意思

var querycopy = query;
query = query.Where(x => x.VersionInt == querycopy.Max(y => y.VersionInt))

或者如oerkelens所建议的那样,将“Max”评估置于Where之外会更加高效。

答案 1 :(得分:2)

在查询之前先找到max(VersionInt)

var maxVersion = query.Max(x => x.VersionInt);
query = query.Where(x => x.VersionInt == maxVersion);