8

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

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 的 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 语句中获得了巨大的性能差异,具体取决于我调用的回购方法之一。

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

任何人都可以解释这一点。我在想 DbSet 到 GetAll 中的 IEnumerable 的转换导致查询执行,因此我在大量内存集上进行分组。由于 GetAllSet 将查询执行推迟到“ToList()”,因此在服务器上按组工作。

它是否正确?有没有另一种方式来解释这一点?

我更希望 GetAll 返回 IEnumerable,因为我更熟悉它并且它更易于测试。

4

1 回答 1

11

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

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

这可以解释性能差异。

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

于 2012-08-14T02:40:22.303 回答