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,因为我对它更熟悉,而且测试起来更容易一些。
谢谢你的工作,完美。我很好奇,你能否更详细地解释一下“物体空间”的含义。或者给我指出任何有关他们的好资源。谢谢 – 2012-08-14 03:00:49
您在'IQueryable'中执行的操作将LINQ to Entities提供程序转换为SQL。你使用'IEnumerable '做的事情不是,因为没有提供商来做转换。所以相反,整个实体必须实现,以便可以使用.NET代码将对象转换为新类型。 –
2012-08-15 02:47:22
伟大的...保存了我的早晨:) – DanielG 2017-05-05 09:20:05