我使用ASP.NET MVC 4和Entity Framework 6(代碼不轉換爲SQL,但是。凡(I => i.IsDeleted.Equals(假))做第一),並有一些奇怪的行爲,我不想/像:
我有有一個布爾屬性IsDeleted
實體類Images
,現在我想拿到第25張圖片,這是不會被刪除,所以我用了以下代碼:。凡(I =>!i.IsDeleted)
IEnumerable<Image> items = db.Images.Where(i => !i.IsDeleted).Take(25);
由於這是非常緩慢的,我調查得更深一些,發現,該Where(i => !i.IsDeleted)
已經觸發DB查詢和所有的圖像加載(和解析=>慢),然後檢查情況「中碼」。然後我嘗試Where(i => i.IsDeleted.Equals(false))
哪些工作正常,並通過SQL檢查發生。
北京時間爲什麼有這麼或者我怎麼能避免這個問題,因爲我喜歡的第一個語法更好?
這可能是EF 6測試版的錯誤,或者在EF版本中會發生這種情況嗎?
UPDATE:
的問題是投給IEnumerable<Image>
(我做了Where
沒有在我的代碼在同一行,但在這裏改變了它爲簡單起見),但我用這還用做.OrderBy(...).ThenBy(...)
Func<T, TKey>
-keys並不會返回IOrderedEnumerable
而不是IOrderedQueryable
...
更新2: 使用Expression<Func<T, TKey>>
鍵解決...
Hrm。這很好奇。那麼Where(i => i.IsDeleted == false)呢? – Tim
@Tim:與'!i.IsDeleted'相同,但我認爲這可能是我隱式轉換爲'IEnumerable'而不是'Where'(我做了'Equals'「inline」,但'!'「在下一行「) - 我正在調查... –
ChrFin
@chrfin行,所以這裏是原因。當你執行'IEnumerable items = db.Images;'使用'IQueryable'時,你會從數據庫獲取所有項目到內存中,而不是使用'IQueryable'來創建查詢,而不是在你真正需要的時候才執行。 –
MarcinJuraszek