如何在Realm中使用不同的查询Xamarin
问题描述:
我正在寻找一种方法来从我的Realm数据库中只选择不同的值。在java中,唯一值返回这样的 -如何在Realm中使用不同的查询Xamarin
RealmResults<Person> unique = realm.where(Person.class).distinct("name");
但是,我不能找到一种方法,Xamarin(.NET)做相同的境界。
答
这是使用LINQ查询支持不同的或不实的问题....
在STANDAR LINQ查询其不支持,但你可以使用一些额外的组件来获得支持它>MoreLINQ
,如果你尝试写你赢了查询其没有太大的困难
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
var query = people.DistinctBy(p => p.Id);
希望这是你的预期
答
及的境界。 Net不直接支持Linq的Distinct
。
集合运算符
鲜明,联合,交叉,除了不支持。
重:https://realm.io/docs/xamarin/latest/api/linqsupport.html
您可以乘坐IRealmCollection
到列表(ToList
),然后执行一个LINQ鲜明的结果。
假设这种模式:
public class ARealmClass : RealmObject
{
public int Key { get; set; }
public string KeyString { get; set; }
}
你需要一个IEqualityComparer
。这是一个简单的例子来比较单一属性KeyString
ARealmClass
的:
public class ARealmClassKeyStringComparer : IEqualityComparer<ARealmClass>
{
public bool Equals(ARealmClass x, ARealmClass y)
{
return (x.KeyString == y.KeyString);
}
public int GetHashCode(ARealmClass obj)
{
if (ReferenceEquals(obj, null)) return 0;
return obj.Key.GetHashCode();
}
}
那么你的境界和LINQ查询:
var queryResults = realm.All<ARealmClass>().ToList().Distinct(new ARealmClassKeyStringComparer());
缺点是这种物化ARealmClass
对象的整个集合,以便采取他们列表并执行独特的操作。如果可能的话,Where
在应用ToList
之前将All<ARealmClass>()
过滤为子集。