К сожалению, API-интерфейс подкачки для AppFabric в V1 отсутствует. Любой из массовых API, например GetObjectsByTag
, будет выполнять запрос на сервере и передавать обратно все соответствующие записи в кэш-памяти клиенту. Оттуда вы, очевидно, можете использовать любые операторы LINQ, которые вам нужны на IEnumerable
(например, Skip/Take/Count
), но имейте в виду, что вы всегда извлекаете полный набор результатов с сервера.
Лично я надеюсь, что AppFabric V2 предоставит поддержку через IQueryable
вместо IEnumerable, что даст возможность удаленно отправить полный запрос на сервер, чтобы он мог публиковать там результаты перед возвратом к клиенту, так же как LINQ2SQL или ADO .NET EF.
На данный момент, одно из возможных решений, в зависимости от возможностей вашего приложения, заключается в том, что вы можете фактически вычислить некоторый вид подкачки при вводе элементов в кэш. Вы можете создавать упорядоченные списки ключей сущностей, представляющих каждую страницу, и сохранять их как отдельные записи в кэше, которые вы можете извлечь в одном запросе, а затем по отдельности (параллельно) или массово получить элементы в списке из кэша и объединить их вместе. с запросом LINQ в памяти. Если вы хотите обменять ЦП на память, просто кешируйте фактический список полных сущностей, а не идентификаторов, и вам необходимо выполнить соединение для сущностей.
Вам, очевидно, придется придумать какой-нибудь механизм ввода ключей, чтобы быстро извлекать эти списки объектов из кэша на основе критериев входящего поиска. Может работать такой вид клавиш:
private static string BuildPageListCacheKey(string entityTypeName, int pageSize, int pageNumber, string sortByPropertyName, string sortDirection)
{
return string.Format("PageList<{0}>[pageSize={1};pageNumber={2};sortedBy={3};sortDirection={4}]", entityTypeName, pageSize, pageNumber, sortByPropertyName, sortDirection);
}
Возможно, вы захотите сделать что-то подобное с отдельным процессом или рабочим потоком, который поддерживает актуальность кэша, а не делает это по требованию и заставляет пользователей ждать, если запись кэша еще не заполнена.
То, работает ли этот подход в конечном итоге для вас, зависит от нескольких факторов вашего приложения и данных. Если это не совсем соответствует вашим сценариям, возможно, это по крайней мере поможет вам изменить свой взгляд на решение проблемы.