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