Обходной путь для LINQ to SQL Кэширование идентификационных данных сущностей и скомпилированный запрос?

Я столкнулся с ошибкой в ​​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));

Кто-нибудь еще сталкивался с этой проблемой и создал обходной путь для нее? Для серверных приложений крайне важно использовать скомпилированные запросы и кэширование идентификаторов, поэтому я надеюсь, что это проблема, с которой кто-то еще сталкивался ранее!

2 ответа

Решение

Я решил использовать грязный хак, чтобы обойти это, используя отражение, чтобы вызвать закрытый метод объектов сущностей linq, называемый GetCachedEntity, для принудительного использования кэша. У меня не было времени на внедрение более чистого решения, но всем, кто интересуется этой темой, я бы порекомендовал реализовать собственный механизм кэширования для этого сценария.

Похоже, ошибка - в этой области был номер.

В качестве обходного пути я бы не стал создавать скомпилированный запрос для такой маленькой / простой операции - реальное преимущество скомпилированного запроса - для больших запросов, которые занимают много времени для обработки в TSQL.

Обновление: это ошибка, которая была решена, так как не будет исправлена.

Другие вопросы по тегам