Entity Framework 5+ должен предварительно скомпилировать все запросы. Однако, для запросов, таких какEntity Framework: предварительно скомпилированный запрос для перечисляемых.Contains
List<Guid> ids;
var entities = context.MyEntities.Where(x => ids.Contains(x.Id)).ToArray();
Entity Framework не может PreCompile запроса, и в зависимости от сложности общего запроса, парсинг дерева выражений в SQL может потреблять несколько секунд. Кто-нибудь нашел обходное решение, чтобы получить предварительно скомпилированный запрос? Я не совсем понимаю, почему так сложно; конечно, это трудно сделать с paramters, так как число элементов может отличаться, но это было бы достаточно, чтобы иметь SQL как
SELECT a, b, c from MyEntities
WHERE c in __PLACEHOLDER__
, а затем заменить заполнитель с реальными элементами списка. Конечно, это не так хорошо, как прохождение параметров, но было бы намного лучше, чем ждать секунд для синтаксического разбора всего дерева выражений.
Списки не могут использоваться в качестве параметров, поэтому он предлагает то, что вы предлагаете, что он создает новый запрос, потому что ваш список может содержать разные элементы при каждом его вызове. Таким образом, это фактически ограничение SQL. –
Не совсем; как сказано, он начинает анализировать дерево выражений с нуля каждый раз.у нас есть запрос с паролем соединений, который занимает 5 секунд для разбора (с несколькими миллисекундами на сервере sql), поэтому я ищу обходной путь. – Roland
@rolandHow большой этот список? Также есть ли у вас аксессуар для использования? Проблема может быть в зависимости от того, как долго каждая запись будет ... насколько он должен сравниться. У меня была аналогичная проблема с .StartsWith до тех пор, пока я не использовал StringComparison.Ordinal, который значительно ускорил его (по сравнению с .Contains). Проблема может заключаться в том, что ему нужно перебирать слишком большие строки (к большому с точки зрения времени требуется время). Если вы можете изменить его для начала и порядкового номера, он должен значительно расшириться (но зависит от вашего конкретного варианта использования). – Thomas