Я сталкивался с ошибкой в linq to sql, где кэширование идентификаторов не работает при выполнении запросов первичного ключа внутри скомпилированного запроса.
Я написал следующий пример, чтобы продемонстрировать использование кэширования идентификаторов. Он выполняет только один вызов базы данных при первом обращении к нему, каждый раз после этого извлекает объект клиента из кэша контекста данных.
for(int i=0; i<10; i++)
{
DataContext.GetTable<Customer>().Single(c=>c.Id == 1);
}
К сожалению, когда я преобразую приведенный выше пример в скомпилированный запрос, он не может использовать кэш идентификаторов и фактически выполняет 10 обращений к базе данных.
for(int i=0; i<10; i++)
{
RetrieveCustomer(DataContext, 1);
}
private static readonly Func<DataContext, int, Customer> RetrieveCustomer =
CompiledQuery.Compile((DataContext context, int id) => context.GetTable<Customer>().Single(c=>c.Id == id));
Кто-нибудь еще сталкивался с этой проблемой и создал обходной путь для нее? Для серверных приложений крайне важно использовать скомпилированные запросы и кэширование идентификаторов, поэтому я надеюсь, что это проблема, с которой уже сталкивался кто-то еще!