2017-10-05 3 views
0

Je cherche un moyen de sélectionner uniquement des valeurs distinctes de ma base de données Realm. En Java, les valeurs uniques sont retournées comme celui-ci -Comment utiliser une requête distincte dans Realm Xamarin

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

Mais, je ne suis pas en mesure de trouver un moyen de faire la même chose dans Realm Xamarin (.net).

Répondre

0

Ceci est vrai question avec le soutien de la requête Linq distincte ou non ....

Dans standar requête LINQ son pas en charge mais vous pouvez utiliser des composants supplémentaires pour obtenir le soutien de celui-ci>MoreLINQ

et si votre essayer d'écrire votre requête a gagné son peu difficile

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); 

Hope this est ce que votre prévu

1

Royaume pour. Net ne prend pas directement en charge le Distinct de Linq.

Set Opérateurs

Distinct, Union, Intersection, et à l'exception ne sont pas pris en charge.

re: https://realm.io/docs/xamarin/latest/api/linqsupport.html

Vous pouvez prendre le IRealmCollection à une liste (ToList) puis effectuer une Linq Distinct sur le résultat.

En supposant que ce modèle:

public class ARealmClass : RealmObject 
{ 
    public int Key { get; set; } 
    public string KeyString { get; set; } 
} 

Vous avez besoin d'un IEqualityComparer. Ceci est un exemple rapide qui compare une seule propriété KeyString de 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(); 
    } 
} 

Ensuite, votre royaume et requête Linq:

var queryResults = realm.All<ARealmClass>().ToList().Distinct(new ARealmClassKeyStringComparer()); 

L'inconvénient est ce matérialise toute la collection des ARealmClass objets afin de prendre à une liste et effectuer l'opération distincte. Si possible Where filtrez le All<ARealmClass>() à un sous-ensemble avant d'appliquer ToList.