私のRealmデータベースから異なる値だけを選択する方法を探しています。Realm Xamarinで別のクエリを使用する方法
RealmResults<Person> unique = realm.where(Person.class).distinct("name");
しかし、私は、レルムXamarin(.NET)で同じことを行うための方法を見つけることができないです - Javaでは、ユニークな値は次のように返されます。
私のRealmデータベースから異なる値だけを選択する方法を探しています。Realm Xamarinで別のクエリを使用する方法
RealmResults<Person> unique = realm.where(Person.class).distinct("name");
しかし、私は、レルムXamarin(.NET)で同じことを行うための方法を見つけることができないです - Javaでは、ユニークな値は次のように返されます。
これは個別のかいないの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);
希望を照会これはあなたの期待何のため
レルムです。ネットはLinqのDistinct
を直接サポートしていません。
集合演算子
、個別UNION、INTERSECT、およびサポートされていません除きます。
再:https://realm.io/docs/xamarin/latest/api/linqsupport.html
リストには(ToList
を)IRealmCollection
を取り、その結果に個別の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
All<ARealmClass>()
をサブセットにフィルタリングしてからToList
を適用してください。