2013-09-14 4 views
1

Ниже приведен фрагмент упрощенной версии проблемы, с которой я столкнулся с Entity Framework v4, где первая загрузка занимает около 30 секунд на столе с 36 строками!Entity Framework slow with optional where clauses

После этого очень быстро загружается до тех пор, пока вы не измените параметры поиска, и это займет 30 секунд, но как только эта комбинация параметров поиска будет выполнена, как только она будет быстрой.

Это повторяется каждый раз, когда используется другая комбинация параметров.

IQueryable<User> result= GetAllUsers(); 

if (!String.IsNullOrWhiteSpace(firstNameSearchParam)) 
{ 
    result = result.Where(u => u.firstname.contains(firstNameSearchParam)) 
}  

if (!String.IsNullOrWhiteSpace(lastNameSearchParam)) 
{ 
    result = result.Where(u => u.lastname.contains(lastNameSearchParam)) 
} 

Var ret = result.ToArray(); 

Любые идеи были бы очень оценены.

Я не уверен, поможет ли pre-compiling the views. Я попытался, но не смог заставить его работать.

+0

Где потрачено время? Профилируйте приложение или приостановите отладчик. – usr

+0

Да, это время в ToArray(), когда запрос выполняется в sql, но запрос в sql занимает долю секунды. Я подозреваю, что, поскольку в первый раз EF строит взгляды или что-то еще, то это происходит во второй раз. Я не уверен, возможно ли получить EF для каждого вида сборки для динамически генерируемых запросов, подобных этому. –

+0

Время не потрачено в ToArray напрямую (не может быть потому, что ToArray ничего не знает о SQL). Стек вызовов идет глубже. Включите «Показать внешний код» и посмотрите на фактический стек. – usr

ответ

0

Сколько времени требуется, когда вы выполняете запрос со стороны SQL?

вы можете использовать эту идею, упомянутый Скоттом здесь по этой ссылке Dynamic Linq

и я думаю, что это будет работать с вами и с Entity Framework, и есть еще одна идея, которую можно использовать рамочный объект метаданных

надеюсь, что это вам поможет

Отношения

+0

Если я захвачу sql из профилировщика и выполнил его, это практически мгновенно, поэтому я уверен, что это не медленный запрос, а способ ef создавая запрос и сопоставляя его с dto. –

+0

Можете ли вы расширить идею метаданных? –

+0

любезно, проверьте эту статью для получения дополнительной информации http://geekswithblogs.net/DavidBarrett/archive/2012/02/06/using-entity-framework-to-query-dynamic-types.aspx – Monah