2012-08-14 43 views
4

我在我的日志库中有以下两种方法。从DbSet转换为IEnumerable是否会导致查询执行?

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


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

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

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

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语句。

  • getAllSet它返回DbSet是快如闪电,
  • GETALL返回IEnumerable的是reallllyyyy缓慢。

有人可以解释这一点。我在想,将DbSet转换为GetAll中的IEnumerable会导致查询执行,因此我正在通过大量内存集合来执行组。虽然GetAllSet将查询执行推迟到“ToList()”,并因此通过在服务器上工作来完成组。

这是正确的吗?还有另外一种解释方法吗?

我更喜欢GetAll返回IEnumerable,因为我对它更熟悉,而且测试起来更容易一些。

回答

8

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

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

这将解释性能差异。

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

+0

谢谢你的工作,完美。我很好奇,你能否更详细地解释一下“物体空间”的含义。或者给我指出任何有关他们的好资源。谢谢 – 2012-08-14 03:00:49

+3

您在'IQueryable '中执行的操作将LINQ to Entities提供程序转换为SQL。你使用'IEnumerable '做的事情不是,因为没有提供商来做转换。所以相反,整个实体必须实现,以便可以使用.NET代码将对象转换为新类型。 – 2012-08-15 02:47:22

+0

伟大的...保存了我的早晨:) – DanielG 2017-05-05 09:20:05

相关问题