我使用ASP NET MVC
4.5和EF6
,代碼優先遷移。EF LINQ ToList非常慢
我有這個代碼,大約需要6秒。
var filtered = _repository.Requests.Where(r => some conditions); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes 6 seconds, has 8 items inside
我認爲這是因爲關係的,它必須建立他們的內部內存,但事實並非如此,因爲甚至當我返回0領域,它仍然是慢。
var filtered = _repository.Requests.Where(r => some conditions).Select(e => new {}); // this is fast, conditions match only 8 items
var list = filtered.ToList(); // this takes still around 5-6 seconds, has 8 items inside
現在請求表是相當複雜的,大量的關係,並擁有16K〜項目。另一方面,過濾的列表應該只包含8個項目的代理。
爲什麼ToList()
方法這麼慢?我實際上認爲問題不在於ToList()方法,但可能是EF問題,或者設計問題不好。
任何人都有過這樣的經驗嗎?
編輯:
這些條件:
_repository.Requests.Where(r => ids.Any(a => a == r.Student.Id) && r.StartDate <= cycle.EndDate && r.EndDate >= cycle.StartDate)
所以基本上,我可以,如果Student
ID是我的ID列表檢查和檢查,如果日期匹配。
你是否在'some condition'中使用了任何導航屬性,因爲它導致了sql方面的連接? – dotctor 2014-11-04 11:00:22
作爲@HamidP的附加,是否將您的導航屬性標記爲「虛擬」?否則,他們會立即加入,而不是延遲加載(糾正我,如果我錯了。) – Marthijn 2014-11-04 13:18:29
是的,他們都是虛擬的。 – Jaanus 2014-11-04 13:23:00