为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.0
【操作系统】:centos
【CPU】: x86
【问题描述】*:
ef core: 版本 Microsoft.EntityFrameworkCore.Dm 6.0.0.16623"
_dbContext.Set<TokenTicket>() .FirstOrDefault(_ => _.Ticket == ticket && _.ExpireTime >= DateTimeOffset.Now && _.Status == TokenTicketStatus.Wait);
报错信息
Dm.DmException (0x80004005): 第3 行附近出现错误:
无法解析的成员访问表达式[SYSDATETIMEOFFSET]
打印sql
Failed executing DbCommand (0ms) [Parameters=[:__ticket_0='?' (Size = 32)], CommandType='Text', CommandTimeout='300']
SELECT TOP(1) "t"."Id", "t"."Audience", "t"."Claims", "t"."ExpireMinutes", "t"."ExpireTime", "t"."Status", "t"."Ticket"
FROM "token_token_ticket" AS "t"
WHERE (("t"."Ticket" = :__ticket_0) AND ("t"."ExpireTime" >= SYSDATETIMEOFFSET())) AND ("t"."Status" = 0)
更正为可以正常执行。
var dateTime = DateTimeOffset.Now;
return _dbContext.Set<TokenTicket>()
.FirstOrDefault(_ => _.Ticket == ticket && _.ExpireTime >= dateTime && _.Status == TokenTicketStatus.Wait);
希望能正确解释SYSDATETIMEOFFSET
从问题的报错来看,就是EFCore框架将DateTimeOffset.Now解析成了数据库中SYSDATETIMEOFFSET函数,但这个函数是SQLServer独有的,在DM中不支持。
可以手动进行改写,将该函数对应到DM数据库中的CURRENT_TIMESTAMP()函数即可。
另外EFCore的问题,我这边也重现一下试试,如果有问题的话,就直接将DateTimeOffset.Now对应成CURRENT_TIMESTAMP()。