2012-08-14 37 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

相關問題