2017-10-05 9 views
0

私のRealmデータベースから異なる値だけを選択する方法を探しています。Realm Xamarinで別のクエリを使用する方法

RealmResults<Person> unique = realm.where(Person.class).distinct("name"); 

しかし、私は、レルムXamarin(.NET)で同じことを行うための方法を見つけることができないです - Javaでは、ユニークな値は次のように返されます。

答えて

0

これは個別のかいないの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); 

希望を照会これはあなたの期待何のため

1

レルムです。ネットは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が必要になります。このモデルを仮定し

。これは、単一のプロパティKeyStringARealmClassのを比較する簡単な例です:

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オブジェクトのコレクション全体を実体化ですそれらをリストに追加して別個の操作を実行します。可能であればWhereAll<ARealmClass>()をサブセットにフィルタリングしてからToListを適用してください。

関連する問題