В надежных коллекциях (в частности, IReliableDictionary) подход к реализации «общих» запросов заключается в обновлении вторичного словаря, который структурирует ключи, которые должны быть упорядочены определенным образом в перечислении. При работе с большими наборами данных мне хотелось бы избежать переноса большого количества данных.
Для этого я хотел бы внедрить какой-то токен продолжения, который вызывающая сторона может предоставить мне при запросе данных. В настоящее время я реализую это, сначала генерируя упорядоченное перечисление и возвращая первые n элементов, где n = размер MAX_PAGE. Продолжение — это, по сути, последний ключ в этом списке из n элементов. В следующий раз, когда вызывающий объект передает токен продолжения, я генерирую упорядоченное перечисление с функцией фильтра, указывающей, что ключ должен быть больше, чем продолжение.
У этого есть 2 проблемы (которые я вижу):
- Коллекция может меняться между моментом, когда вызывающая сторона впервые запрашивает страницу, и последующим запросом. Я не уверен, что смогу избежать этого, поскольку обновления коллекции должны происходить в любое время, независимо от того, кто пытается просмотреть данные.
- Я не уверен, как используется функция фильтра. Я предполагаю, что, поскольку разработчик может фильтровать что угодно, метод GetEnumerableAsync() должен предоставлять все ключи в словаре, прежде чем возвращать перечисляемое. Для достаточно большого набора данных это кажется медленным.
Существуют ли какие-либо предписанные подходы для разбиения данных на страницы, подобные этому? Мне начинает казаться, что я использую неверные коллекции с надежными коллекциями для некоторых случаев использования.