如何在 Realm .NET SDK 中查询 DateTimeOffset 的 DateTime 属性

问题描述 投票:0回答:1

我的领域模型具有“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

如何完成这项任务?

c# .net linq xamarin.forms realm
1个回答
0
投票

你在 Realm 中记录的实际上是一个时间戳,其中包括日期信息以及时间信息甚至时区偏移!

Realm 里是这样的

2023-08-28T21:43:17.300Z

这意味着,如果您使用相等性来尝试将其与今天进行比较,它将失败,因为今天是今天生成的,因此即使实际日期匹配,时间也不会匹配。

有很多解决方案,所以让我概括地介绍一些。

  1. 如果您不关心时间,您可以仅使用日期组件存储所有日期,并将所有时间设置为 0。例如,用户的生日。时间部分可能并不重要,因此创建如下所示的时间戳

    2023-04-01T00:00:00.000Z

并且可以轻松过滤,创建您想要查找的日期,将其时间分量设置为 0 并进行过滤。

  1. 拥有两个托管属性;一个是实际时间戳(包括时间),另一个是日期格式的字符串,如 yyyy-mm-dd,这样所有日期比较都可以使用该字符串完成。创建一个今天,提取 yyyy、mm 和 dd,构建一个字符串并进行比较。

  2. 使用之前和之后...创建一个今天,然后为昨天创建一个变量,为明天创建一个变量

    让foundDay = dateToSeachFor > 昨天和dateToSearchFor < tomorrow

© www.soinside.com 2019 - 2024. All rights reserved.