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

Dav*_*hel 6 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;
}           
Run Code Online (Sandbox Code Playgroud)

唯一的区别是一个返回一个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();
Run Code Online (Sandbox Code Playgroud)

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

  • 返回DbSet的getAllSet快速闪电,
  • GetAll返回IEnumerable真的很慢.

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

它是否正确?还有另一种解释方法吗?

我更喜欢让GetAll返回IEnumerable,因为我对它更熟悉并且它更容易进行测试.

Cra*_*ntz 10

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

,在另一方面,把查询到的对象的空间,所以生成的SQL将是不同的,当你投射到一个匿名类型.观察SQL Server Profiler以查看差异.

这可以解释性能差异.

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

  • 使用LINQ to Entities提供程序在`IQueryable <T>`中执行的操作将转换为SQL.使用`IEnumerable <T>`的东西不是,因为没有提供者进行转换.因此,必须实现整个实体,以便可以使用.NET代码将对象转换为新类型. (3认同)