更新:此技术不再有效。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~
...它也不同于 LINQ to Objects 的行为,其中每次迭代都会重新计算表达式,这意味着条件两侧的更改都会影响结果。 Realm 查询将在第一次运行时评估条件的右侧。
当您构建包含基于 非-基于领域的条件的 Where 参数的查询时,除非您更新/执行查询,否则当这些变量/参数发生更改时,查询结果不会更新再次。
领域查询是实时的,因为它们将继续代表数据库的当前状态。
所以我要做的是创建一个过滤器类(RealmObject),然后如果您实例化一个“过滤器对象”,将其保存到 Realm,您可以将 Linq 的 Where 参数基于一个或多个“过滤器”属性。通过Realm.Add(filterObject, true) 更新此RealmObject 过滤器,您基于该对象的查询也会更新
领域查询是实时的,因为它们将继续代表数据库的当前状态。
结果是快速过滤,适用于任何 UI 搜索例程。
示例模型:
public class ARealmClass : RealmObject
{
public int Key { get; set; }
public string KeyString { get; set; }
}
public class ARealmClassFilter : RealmObject
{
[PrimaryKey]
public int Key { get; set; }
public int FilterKeyBy { get; set; }
}
用一些测试数据填充一个领域
var realm = Realm.GetInstance();
var all = realm.All<ARealmClass>();
if (all.Count() == 0)
{
realm.Write(() =>
{
for (int i = 0; i < 1000; i++)
{
var obj = new ARealmClass { Key = i, KeyString = i.ToString() };
realm.Add(obj);
}
});
}
动态实时查询示例:
var realm = Realm.GetInstance();
var all = realm.All<ARealmClass>();
Console.WriteLine(all.Count());
var filterItem = new ARealmClassFilter { Key = 1, FilterKeyBy = 500 };
realm.Write(() =>
{
realm.Add(filterItem);
});
var filtered = all.Where(_ => _.Key > filterItem.FilterKeyBy);
Console.WriteLine(filtered.Count());
realm.Write(() =>
{
filterItem.FilterKeyBy = 750;
realm.Add(filterItem, true);
});
Console.WriteLine(filtered.Count());
输出:
2017-04-24 11:53:20.376 ios_build_foo[24496:3239020] 1000
2017-04-24 11:53:20.423 ios_build_foo[24496:3239020] 499
2017-04-24 11:53:20.425 ios_build_foo[24496:3239020] 249
注意:引用文字@https://realm.io/docs/xamarin/latest/api/linqsupport.html