如何在Realm .NET SDK中查询DateTimeOffset类型的日期属性
问题
我的Realm模型包含一个DateTimeOffset类型的Date属性,定义如下:
public class Log : RealmObject { // 省略其他代码 public DateTimeOffset Date { get; set; } }
我想获取所有属于特定日期的对象,最初尝试用Linq查询:
.All<Log>().Where(x => x.Date.DayOfYear == DateTimeOffset.Now.DayOfYear);
但Realm抛出错误:
The left-hand side of the Equal operator must be a direct access to a persisted property in Realm.
Unable to process 'x.Date.DayOfYear'
原因是Linq不支持嵌套属性查询。之后我尝试用Realm查询语言(RQL)实现:
.All<Log>().Filter("Date.DayOfYear == $0", DateTimeOffset.UtcNow.DayOfYear).FirstOrDefault();
同样抛出异常:
Property 'Log.Date' is not an object reference
请问该如何完成这个查询任务?
解决方案
Realm不支持直接对日期的DayOfYear这类嵌套属性做查询,但可以通过构造日期范围来实现需求:
- 先计算目标日期的起始时间(当天0点0分0秒)和结束时间(次日0点0分0秒)
- 用
Date >= 起始时间且Date < 结束时间的范围条件过滤数据
示例代码如下:
// 获取当前日期的起始和结束边界 var today = DateTimeOffset.Now.Date; var startOfDay = today; var endOfDay = today.AddDays(1); // 查询当天所有Log记录 var todayLogs = realm.All<Log>() .Where(x => x.Date >= startOfDay && x.Date < endOfDay) .ToList();
如果要基于UTC时间查询(避免时区偏差问题),可以调整为:
var todayUtc = DateTimeOffset.UtcNow.Date; var startOfDayUtc = todayUtc; var endOfDayUtc = todayUtc.AddDays(1); var todayLogsUtc = realm.All<Log>() .Where(x => x.Date >= startOfDayUtc && x.Date < endOfDayUtc) .ToList();
这种方法利用Realm支持的直接属性比较,既能避开嵌套属性的限制,又能准确过滤出指定日期的所有记录;如果给Date字段添加索引,还能进一步提升查询效率。
内容的提问来源于stack exchange,提问作者Sev
相关产品推荐
相关产品推荐

