我的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方法。
任何人都可以解释一下。我当时认为在GetAll中将DbSet转换为IEnumerable导致Query执行,因此我在一个庞大的内存集中执行该组。虽然GetAllSet将查询执行推迟到“ToList()”,因此在服务器上通过工作来执行该组。
这是对的吗?还有另一种解释方法吗?
我更希望GetAll返回IEnumerable,因为我对它更熟悉,而且测试更容易。
答案 0 :(得分:10)
不,转换为IEnumerable<T>
不会导致它执行。
这可以解释性能差异。
如果您返回IQueryable<T>
而不是IEnumerable<T>
,则SQL /性能应该相同。