gpt4 book ai didi

c# - 针对 Entity Framework 的 LINQ 查询如何将日期传递给 SQL Server?

转载 作者:行者123 更新时间:2023-11-30 12:18:21 27 4
gpt4 key购买 nike

我使用 Entity Framework 使用两个 LINQ 查询来访问我的数据库:

第一个在数据库中存储一个 token 并给它一个 60 秒的超时时间:

string tokenHash = GetTokenHash();
Token token = new Token()
{
Client = client,
Expiry = DateTime.Now.AddSeconds(60),
UserId = userId,
TokenHash = tokenHash,
};
context.AddToToken(token);
context.SaveChanges();

第二个检查尚未过期的匹配 token :

var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
&& t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t);
bool success = item.Count() >= 1;

我遇到的问题是这在测试服务器上运行良好。现在它已移动到不同的环境,它不再有效。

我转储了很多调试信息,一切似乎都匹配。如果我删除 t.Expiry > DateTime.Now 条件,它工作正常。所以问题出在日期比较上。

新服务器在 Windows 中设置了不同的日期格式和全局化设置。我认为这就是问题所在,这让我感到困惑。

我本以为可以使用 LINQ 和 EF 一致地存储和检索日期。我不应该有任何格式问题吗?谁能告诉我这里出了什么问题?


更新:

有趣的是,通过将检索代码替换为以下内容,我得到了正确的行为:

var item = (from t in datasource.SmsToken
where t.Client.Id == clientId
&& t.UserId == userId
// && t.TokenHash == tokenHash
// && t.Expiry > DateTime.Now
select t).ToList();

var matchingToken = (from t in item
where t.TokenHash == tokenHash
&& t.Expiry > DateTime.Now
select t).FirstOrDefault();

bool success = matchingToken != null;

在我看来,这表明问题与 Linq-to-entities 内部的日期比较有关。 Linq-to-objects 工作正常!

最佳答案

您是否在具有相同时区的服务器上插入 token 并检索比较?

最好不要将本地时间存储在数据库中。一方面,它消除了在一个时区排队和在另一个时区出队的问题。其次,该代码全年都有效:就像现在一样,您的代码每年都会“设计”两个晚上:夏令时开始和夏令时结束。

更好用DateTime.UtcNow用于入队和出队操作。

话虽如此,这不太可能是您面临的问题。但是要知道在您的情况下发生的比较类型,我们需要知道 Expiry 列的类型,如在数据库中声明的和在 EF 中声明的那样。它是字符串、日期时间还是日期时间偏移量?

关于c# - 针对 Entity Framework 的 LINQ 查询如何将日期传递给 SQL Server?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com