EF Core 3.1中的TimeSpan问题

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

我在使用EF Core 3.1查询PostgreSQL数据库时遇到问题。

查询非常简单

var gamesQuery = this.dbContext.Games.Where(game => game.StartTime > DateTime.Now).AsQueryable();

// 'request.TimeFrom' is of type System.TimeSpan and the value is populated
gamesQuery = gamesQuery.Where(game => game.StartTime.TimeOfDay >= request.TimeFrom);

// .ToList()-int here causes the exception.
var games = gamesQuery.ToList();

异常消息明确指出查询无法翻译:

“ LINQ表达式'DbSet \ r \ n .Where(g => g.StartTime> DateTime.Now)\ r \ n .Where(g => g.StartTime.TimeOfDay> = __request_TimeFrom_0)'可以以可以翻译的形式重写查询,也可以通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。请参见https://go.microsoft.com/fwlink/?linkid=2101038。信息。“

问题是,同一查询在.NET Core 2.2中可以正常工作。我还没有发现有关该问题的任何信息。

有人知道这是什么原因还是我错过了什么?

c# postgresql entity-framework-core timespan
1个回答
3
投票

[当前PostgreSQL EF Core 3.x查询提供程序不支持DateTime.TimeOfDay的翻译-请参阅TODO中的source code注释。

[很可能它通过静默使用客户端评估在2.x中“工作”。但是隐式客户端评估has been removed in 3.0,并且没有办法将其重新打开。

您可以尝试以下等效构造:

.Where(game => (game.StartTime - game.StartTime.Date) >= request.TimeFrom)

至少它不会产生上述异常。

如果不起作用,请听取他们的建议,并在不可翻译的表达式之前的适当位置插入AsEnumerable(),以明确转换为客户评估。

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