2013-08-16 20 views
5

我使用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>>鍵解決...

+1

Hrm。這很好奇。那麼Where(i => i.IsDeleted == false)呢? – Tim

+0

@Tim:與'!i.IsDeleted'相同,但我認爲這可能是我隱式轉換爲'IEnumerable '而不是'Where'(我做了'Equals'「inline」,但'!'「在下一行「) - 我正在調查... – ChrFin

+2

@chrfin行,所以這裏是原因。當你執行'IEnumerable items = db.Images;'使用'IQueryable'時,你會從數據庫獲取所有項目到內存中,而不是使用'IQueryable'來創建查詢,而不是在你真正需要的時候才執行。 – MarcinJuraszek

回答

0

ŧ他的問題是,只要您使用IEnumerable查詢將被執行,所有以下查詢將作爲LINQ到對象查詢發生。

我的錯誤,讓我們對這個問題是我測試的查詢方式如下:

IEnumerable<Image> items = db.Images.Where(i => i.IsDeleted.Equals(false)); 

IEnumerable<Image> items = db.Images; 
images = images.Where(i => !i.IsDeleted); 

所以在第一種情況下Where仍然針對IQueryable執行,但在第二種情況下對IEnumerable

後來我遇到一個問題,即OrderByIQueryable你需要Expression<Func<T, K>>參數,我用Expression<Func<T, IComperable>>,但如實體框架不能將Func<T, int>鑄造成Func<T, IComperable>
要查看詳細信息如何解決此問題,請參閱我的其他問題HERE

相關問題