У меня есть следующий запрос LINQ, выполняемый с использованием Entity Framework (v6.1.1):
private IList<Customer> GetFullCustomers(IEnumerable<int> customersIds)
{
IQueryable<Customer> fullCustomerQuery = GetFullQuery();
return fullCustomerQuery.Where(c => customersIds.Contains(c.Id)).ToList();
}
Этот запрос переведен в довольно хороший SQL:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[FirstName] AS [FirstName]
-- ...
FROM [dbo].[Customer] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 5)
Тем не менее, я получаю очень значительное повышение производительности на этапе компиляции запросов. Призвание:
ELinqQueryState.GetExecutionPlan(MergeOption? forMergeOption)
Получает ~ 50% времени каждого запроса. Копая глубже, оказалось, что запрос перекомпилируется каждый раз, когда я передаю разные клиенты. Согласно статье MSDN, это ожидаемое поведение, поскольку IEnumerable, который используется в запросе, считается изменчивым и является частью SQL, который кэшируется. Именно поэтому SQL отличается для каждой комбинации клиентов и всегда имеет различный хеш, который используется для получения скомпилированного запроса из кеша.
Теперь возникает вопрос: Как я могу избежать этой повторной компиляции, все еще запрашивая несколько клиентов?