我注意到Entity Framework 6.1的一个非常奇怪的行为.我的目标是有条件地从填充了2百万条记录的表中计算一些行.首先,我已经使用简单的方法来获得所需的值:
private void SeedsQuery(object o)
{
StatProperty property = o as StatProperty;
using (SteelPoppyContext context = new SteelPoppyContext())
{
property.Value = context.QueuedGames.Count(game => game.IsSeed);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码运行大约1秒,无需使用任何内存即可提供所需的结果.现在,我想使用switch语句为同一个查询实现更多条件.最简单的方法是使用每次运行查询时提供的委托.为了简化我们的案例,我准备了一个简单的例子.
private void SeedsQuery(object o)
{
StatProperty property = o as StatProperty;
Func<QueuedGame, bool> predicate = new Func<QueuedGame, bool>(game => game.IsSeed);
using (SteelPoppyContext context = new SteelPoppyContext())
{
property.Value = context.QueuedGames.Count(predicate);
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法应该与上面的方法完全相同.但是,当我运行此代码时,查询执行大约需要1分钟,并使用内存跳转到1GB.我猜测实体框架正在从数据库中获取所有数据,然后检查条件.这种行为有什么解释吗?