我正在寻找一种从我的Realm数据库中仅选择不同值的方法。在java中,返回唯一值,如下所示 -
RealmResults<Person> unique = realm.where(Person.class).distinct("name");
但是,我无法在Realm Xamarin(.net)中找到相同的方法。
答案 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);
希望这是你的预期