【问题标题】:How to query only specific properties of RealmObject?如何仅查询 RealmObject 的特定属性?
【发布时间】:2025-11-28 03:25:02
【问题描述】:

例如,我有对象:

public class person : RealmObject { 
        public string firstname { get; set; }
        public string secondname { get; set; }
        public int age { get; set; }
        public string address { get; set; }
}

如何进行查询,只给我地址或名字+第二名的列表?

或者名字和年龄。

【问题讨论】:

  • 查询?您是否有内存中的对象列表并且想要查询该列表?你想从数据库中获取这些数据吗?
  • 当然是来自 Realm 数据库。
  • 您如何访问您的数据库?使用 ADO.NET 还是 ORM?如果你使用 ORM,你使用哪个 ORM?
  • 不确定。我只是使用 Realm 库和这个语法:realm.io/docs/xamarin/latest
  • 如果您曾经使用过 LINQ,那么如何使用 Realm 获取数据非常简单。请看我的回答。如果你还没有,尽管你会通过阅读代码来理解(LINQ 的简单性和可读性),但我鼓励你阅读 LINQ,因为它是任何 C# 开发人员都应该掌握的 C# 的一部分。它可以挽救生命:)

标签: c# xamarin realm


【解决方案1】:

一般Select目前不支持...

只要您的Select 投影RealmObject,它就受支持,但您要求的投影将类型从RealmObject 更改为另一种类型并且不支持:

如果您确实需要断开对象与 Realm 数据库的连接,您可以将基本查询带到一个列表 (.ToList),然后然后对结果执行 Select 投影:

realm.All<Dog>().ToList().Select(dog => dog.Name);

更新:

对于您的名字+名字问题,我会将其添加为您的 RealmObject 子类的只读属性。由于该属性有一个自定义的 setter/getter,它不会被持久化在 Realm 数据存储中。

public class person : RealmObject
{
    public string firstname { get; set; }
    public string secondname { get; set; }
    public int age { get; set; }
    public string address { get; set; }

    public string name { get { return firstname + " " + secondname; } }
}

然后你可以这样做:

var realm = Realms.Realm.GetInstance("*.db");
var me = new person() { firstname = "Sushi", secondname = "Hangover", age = 99, address = "Local sushi bar" };
realm.Write(() => realm.Add<person>(me));
var user = realm.All<person>().Where((person p) => p.firstname == "Sushi" && p.secondname == "Hangover").FirstOrDefault();
Console.WriteLine($"{user.name} is {user.age} years old and is currently at {user.address}");

输出:

Sushi Hangover is 99 years old and is currently at Local sushi bar

更新2:

如果您希望遍历返回的 RealmObjects 集合:

var users = realm.All<person>().Where((person p) => p.age < 40);
Console.WriteLine($"There are {users.Count()} users under 40 years of age and they are located at:");
foreach (var user in users)
{
    Console.WriteLine($"{user.firstname} is currently at {user.address}");
}

【讨论】:

  • 但是在性能方面什么方式是最优化的呢?是不是.ToList 之前Select 会导致过度操作?
  • 在性能方面,使用生成的RealmObject。它是live 并连接到Realm 数据库,并且在检索Realm 映射对象的所有属性时没有惩罚。将它放到一个列表中,然后投影一个属性较少的对象会影响性能(内存和速度),但有时您可能想要中断 live 连接,ToList 会这样做。跨度>
  • @InfernumDeus 当您使用 Linq Select 将基础对象转换为某物时,即 选择投影,在您的问题中,仅检索 i> first name 将是 RealmObjects 的 IEnumerable 到字符串的 IEnumerable 的投影
  • @InfernumDeus 我添加了一个 RealmResult 迭代......所有这些 cmets,谢谢!
  • @InfernumDeus 啊,我现在明白了,在使用 Realm 时,只需考虑对象属性和枚举,因为它是一个 ORM。没问题,很高兴我能帮上忙……
【解决方案2】:

您可以尝试以下方法:

var realm = Realm.GetInstance();

var addresses = realm.All<person>()
                     .ToList()
                     .Select(person => person.address)
                     .ToList();

var firstAndSecondNames = realm.All<person>()
                               .ToList()
                               .Select(person => new
                               {
                                   FirstName = person.firstName,
                                   SecondName = person.secondName
                               })
                               .ToList();

【讨论】:

  • 仅供参考:您需要先将 RealmObject/RealmResult 查询放到列表中,然后执行 Select 投影。
  • @SushiHangover 获取信息,我不知道这一点。