Tam*_*fai 1 linq sql-server entity-framework-core ef-core-5.0
我遇到一个问题,我想仅根据 DateTimeOffset SQL Server 列的 DateTime 进行查询,我想知道是否可以使用 EF Core 进行查询。
如果我在世界各地都有约会,并且我的业务逻辑将它们准确地记录在本地 DateTimeOffset 中,那么我希望能够获得特定日期的约会,而不管时区如何,但是,我得到一个例外,即查询不能当我尝试以下操作时翻译:
public class Appointment
{
public int Id {get;set;}
public DateTimeOffset BeginTime {get;set;}
}
DateTime queryDay = new DateTime(2021, 1, 1);
var results = dbContext.Appointments.Where(a => a.BeginTime.DateTime >= queryDate && a.BeginTime.DateTime < queryDay.AddDays(1)).ToList();
Run Code Online (Sandbox Code Playgroud)
有没有办法用 EF Core 来做到这一点?我的意思是,在示例中,我只是想获取一个特定的日期,但实际上,我希望能够针对具有任何时间值的任何日期时间执行此操作。
换句话说,我不想按通用时间范围进行过滤,而是按不考虑偏移的时间范围进行过滤。
即使我创建返回 BeginTime.DateTime 的 [NotMapped] 属性,似乎也不起作用。
编辑:
确切的错误:
System.InvalidOperationException:无法翻译 LINQ 表达式 'DbSet() .Where(t => True && t.BeginTime.DateTime >= __fakeStartDate_1 && t.BeginTime.DateTime < __fakeEndDate_2)'。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038 。
SqlServer 提供程序支持所谓的“双重转换”构造(首先为object,然后为其他类型,例如(DateTime)(object)),该构造会欺骗 C# 编译器接受通常会失败的转换(如果在 LINQ to Objects 上下文中执行,则会失败),并且 EF Core翻译器,迫使后者发出从使用运算符datetimeoffset到使用运算符的转换。datetime2 CAST
例如
var query = dbContext.Appointments
.Where(a => ((DateTime)(object)a.BeginTime) >= queryDate
&& ((DateTime)(object)a.BeginTime) < queryDate.AddDays(1));
Run Code Online (Sandbox Code Playgroud)
成功翻译为
DECLARE @__queryDate_0 datetime2 = '2021-01-01T00:00:00.0000000';
DECLARE @__AddDays_1 datetime2 = '2021-01-02T00:00:00.0000000';
SELECT [a].[Id], [a].[BeginTime]
FROM [Appointments] AS [a]
WHERE (CAST([a].[BeginTime] AS datetime2) >= @__queryDate_0) AND (CAST([a].[BeginTime] AS datetime2) < @__AddDays_1)
Run Code Online (Sandbox Code Playgroud)