我的领域模型具有“Date”属性,其类型为 DateTimeOffset。
public class Log : RealmObject
{
// other code omitted for brevity
public DateTimeOffset Date { get; set; }
}
我想获取日期为特定日期的所有对象。我最初尝试使用像这样的 linq 查询
.All<Log>().Where(x => x.Date.DayOfYear == DateTimeOffset.Now.DayOfYear);
但是领域抛出
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 中查询嵌套属性。 https://github.com/realm/realm-dotnet/issues/806
然后我尝试使用领域查询语言来完成任务
.All<Log>().Filter("Date.DayOfYear == $0", DateTimeOffset.UtcNow.DayOfYear).FirstOrDefault();
但这也会引发异常
Property 'Log.Date' is not an object reference
如何完成这项任务?
你在 Realm 中记录的实际上是一个时间戳,其中包括日期信息以及时间信息甚至时区偏移!
Realm 里是这样的
2023-08-28T21:43:17.300Z
这意味着,如果您使用相等性来尝试将其与今天进行比较,它将失败,因为今天是今天生成的,因此即使实际日期匹配,时间也不会匹配。
有很多解决方案,所以让我概括地介绍一些。
如果您不关心时间,您可以仅使用日期组件存储所有日期,并将所有时间设置为 0。例如,用户的生日。时间部分可能并不重要,因此创建如下所示的时间戳
2023-04-01T00:00:00.000Z
并且可以轻松过滤,创建您想要查找的日期,将其时间分量设置为 0 并进行过滤。
拥有两个托管属性;一个是实际时间戳(包括时间),另一个是日期格式的字符串,如 yyyy-mm-dd,这样所有日期比较都可以使用该字符串完成。创建一个今天,提取 yyyy、mm 和 dd,构建一个字符串并进行比较。
使用之前和之后...创建一个今天,然后为昨天创建一个变量,为明天创建一个变量
让foundDay = dateToSeachFor > 昨天和dateToSearchFor < tomorrow