Npgsql在EFCore中无法翻译DateTimeOffset.Date。

4

这是预期行为吗?如果是,是否有任何解决方法?我正在使用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();
    }

运行此查询将返回以下错误,我将其归因于提供程序无法提取日期部分:s.Fecha.Date(DateTimeOffset.Date)。我阅读了文档,并且发现DateTimeOffset在PostgreSQL中将存储为timestamptz,但我没有找到任何关于常用函数(如获取日期部分)的限制。

LINQ表达式[...]无法被翻译。请重新编写查询以便能够进行翻译。

我可以使用以下解决方法,它可以正常工作,但似乎是一种更低效的查询方式:
    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();
    }
1个回答

5

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

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


谢谢,我简直不敢相信我找不到那个信息,我搜了好几个小时也什么都没找到。 - pupper9
4
对于任何看到这条信息的人,Npgsql EF Core提供程序的6.0版本增加了对DateTimeOffset的大量翻译支持 - 但请注意时间戳处理方面也有一些重大的破坏性变化。此外,请注意PostgreSQL 没有 DateTimeOffset类型(偏移量不会被存储),因此仅支持UTC DateTimeOffset。 - Shay Rojansky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接