c# - 从大型 RealmCollection 中获取一小部分项目的最佳方法是什么?
问题描述
我目前正在使用 Realm 5.1.2 开发一个 Xamarin.Forms 项目。我需要收集一组 RealmObject,将它们过滤成一个较小的集合,然后将它们转换为 UI 元素,以便根据每个项目显示数据。在较小的数据集上,我的实现效果很好。但是,当尝试使用大型数据集(1,000,000 多个项目开始,过滤到 ~1000)时,应用程序在尝试转换过滤后的对象时会急剧变慢。
到目前为止,我已尝试通过将过滤过程包含到 IQueryables 和 IRealmCollection 来解决此问题。我知道在最终结果中实例化所有对象会导致速度变慢。我希望添加一个延迟加载方法,因为不是每个元素都一次可见(一次只加载 10 个,并根据需要请求更多)。我目前的实现是:
一次创建 RealmCollection:
var filteredRealmCollection = localRealm.All<Field>()
.Where(field => field.IndexedId == input.TargetIndexId) //Use indexed parameter for initial filter
.Where(field => field.Value == input.TargetValue) //Take all fields that match the requested filter value
.AsRealmCollection();
根据需要呼吁新项目:
IEnumerable<FieldItemViewModel> GetFieldItemViewModels(int numberToSkip, int numberToTake)
{
return filteredRealmCollection
.Skip(numberToSkip)
.Take(numberToTake)
.Select(field => new FieldItemViewModel(field)
}
RealmCollection 的创建运行得很好,如果我等待整个列表实例化,它具有正确的值。调用 GetFieldItemViewModels 也可以正常工作。但是当我尝试实际使用返回的 IEnumerable 时,应用程序会冻结,直到它实例化整个 filtersRealmCollection。我还尝试使用 RealmCollection[index] 来获取项目的子集,结果相似。
有没有办法只实例化我使用 RealmCollection 请求的项目,以便我只加载 10 个项目而不是 ~1000 个?如果没有,是否有不同的方法来完成我在这里尝试做的事情?
解决方案
推荐阅读
- html - 引导程序中导航栏下方的白条
- javascript - 如何在全局范围内创建 async/await
- c++ - 用于读取复数的 c++ 正则表达式
- android - Websocket 在“101 Switching Protocols”响应中关闭与 EOF 异常的连接
- c - 函数参数接收一个 int "b" 数字但打印一个随机数(函数调用函数)
- ruby-on-rails - Rails 5.2 Auth - create_new_auth_token 后返回的令牌
- google-cloud-platform - 是否有用于 google 语音到文本的语言支持的 API?
- java - 如何使用毕加索从 .mp3 文件中检索专辑封面
- android - React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件
- c# - 将 2 个 datagridview 分组列减去第三列