Это ожидаемое поведение? Если да, то есть ли обходной путь? Я использую 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 будет сохранен как timestamptz в PostgreSQL, но я не нашел никаких ограничений на общие функции, такие как получение части даты.
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 с Kind = Utc.
Спасибо, я не могу поверить, что не смог найти эту информацию, я искал несколько часов, но ничего не нашел.