EF Core 中的 Postgresql 无法翻译 DateTimeOffset.Date

Npgsql in EFCore cannot translate DateTimeOffset.Date

这是预期的行为吗?如果是这样,有什么解决方法吗?我正在使用 Net Core 5.0 和 npgsql 5.0

    public async Task<List<long>> GetGuiaIdsWithFilters(DateTime createddate)
    {
        IQueryable<Guia> guiaToReturn = _context.Guia;
        createddate = createddate.ToUniversalTime();
        return await guiaToReturn.Where(g => g.StatusHistory.Any(s.Fecha.Date == createddate.Date)).Select(x => x.Id).ToListAsync();
    }

运行 此查询将 return 以下错误,我将其隔离为无法提取日期部分的提供商:s.Fecha.Date (DateTimeOffset.Date)。我阅读了文档,DateTimeOffset 将在 PostgreSQL 中存储为 timestamptz,但我没有发现对常用功能(例如获取日期部分)有任何限制。

The LINQ expression [...] could not be translated. Either rewrite the query in a form that can be translated

我可以执行以下工作正常的解决方法,但它似乎是一个效率低得多的查询:

    public async Task<List<long>> GetGuiaIdsWithFilters(DateTime createddate)
    {
        IQueryable<Guia> guiaToReturn = _context.Guia;
        var FromDate = createddate.ToUniversalTime().AddDays(-1);
        var ToDate = createddate.ToUniversalTime.AddDays(1);
        return await guiaToReturn.Where(g => g.StatusHistory.Any(s => s.Fecha > FromDate && s.Fecha < ToDate)).Select(x => x.Id).ToListAsync();
    }

Npgsql EF Core 提供程序目前不翻译 DateTimeOffset 上的成员(参见 https://github.com/npgsql/efcore.pg/issues/473)。

请注意,不鼓励将 DateTimeOffset 与 Npgsql 一起使用,因为 PostgreSQL 没有与之对应的类型。 DateTimeOffset 映射到 PostgreSQL timestamp with time zone,它实际上没有时区。如果您的时间戳也是 UTC,请考虑使用 DateTime with Kind=Utc。