从DbSet转换为IEnumerable会导致查询执行吗?

时间:2012-08-14 01:45:29

标签: entity-framework dbset

我的Logs存储库中有以下两种方法。

public IEnumerable<Log> GetAll()
{
   var db = new CasLogEntities();
   return db.Logs;
}           


public DbSet<Log> GetAllSet()
{
   var db = new CasLogEntities();
   return db.Logs;
}           

唯一的区别是一个返回一个IEnumerable的Log,另一个返回一个DbSet of Log。

在我的资产控制器中,我有以下代码

var allLogs = _logRepo.GetAllSet();
var Logs = (from log in allLogs
              group log by log.DeviceId
              into l
              select new {DeviceId = l.Key, TimeStamp = l.Max(s => s.TimeStamp)}).ToList();

现在问题是我在group by语句中获得了巨大的性能差异,具体取决于我调用哪个repo方法。

  • getAllSet返回DbSet是快闪的,
  • GetAll返回IEnumerable真的很慢。

任何人都可以解释一下。我当时认为在GetAll中将DbSet转换为IEnumerable导致Query执行,因此我在一个庞大的内存集中执行该组。虽然GetAllSet将查询执行推迟到“ToList()”,因此在服务器上通过工作来执行该组。

这是对的吗?还有另一种解释方法吗?

我更希望GetAll返回IEnumerable,因为我对它更熟悉,而且测试更容易。

1 个答案:

答案 0 :(得分:10)

不,转换为IEnumerable<T>不会导致它执行。

另一方面,确实将查询带入对象空间,因此当您投影到匿名类型时,生成的SQL会有所不同。观察SQL Server Profiler以查看差异。

这可以解释性能差异。

如果您返回IQueryable<T>而不是IEnumerable<T>,则SQL /性能应该相同。