如何在Realm Xamarin中使用不同的查询

时间:2017-10-05 04:42:51

标签: .net xamarin realm

我正在寻找一种从我的Realm数据库中仅选择不同值的方法。在java中,返回唯一值,如下所示 -

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

但是,我无法在Realm Xamarin(.net)中找到相同的方法。

2 个答案:

答案 0 :(得分:1)

.Net的Realm并不直接支持Linq的Distinct

  

设置运算符

     

不支持Distinct,Union,Intersect和Except。

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

您可以将IRealmCollection带到列表(ToList),然后对结果执行Linq Distinct。

假设这个模型:

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

然后你的Realm和Linq查询:

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

缺点是它实现了ARealmClass个对象的整个集合,以便将它们带到列表并执行不同的操作。如果可能,Where会在应用All<ARealmClass>()之前将ToList过滤为子集。

答案 1 :(得分:0)

这是Linq查询支持不同的真正问题....

在标准中Linq查询它不支持但你可以使用一些额外的组件来获得它的支持&gt; 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);

希望这是你的预期