C# Select()的内部布尔值
我有一个人员表,其中填写了人员信息。我想获取表中的人员列表,检查他们是否在过去24小时内更新了密码,然后返回一个人名和一个布尔属性,无论他们是否更新了密码 这是我的个人表:C# Select()的内部布尔值,c#,.net,linq,entity-framework,linq-to-entities,C#,.net,Linq,Entity Framework,Linq To Entities,我有一个人员表,其中填写了人员信息。我想获取表中的人员列表,检查他们是否在过去24小时内更新了密码,然后返回一个人名和一个布尔属性,无论他们是否更新了密码 这是我的个人表: varchar(30) Name, DateTime LastRenewedPassword. 人员表: varchar(30) Name, DateTime LastRenewedPassword. 代码: 公共类人物 { 公共字符串名称{get;set;} 公共布尔HasRenewedPassword{get;set
varchar(30) Name,
DateTime LastRenewedPassword.
人员表:
varchar(30) Name,
DateTime LastRenewedPassword.
代码:
公共类人物
{
公共字符串名称{get;set;}
公共布尔HasRenewedPassword{get;set;}
}
公众人士名单
{
使用(var context=Entities())
{
var persons=从上下文中的p开始
选择新人
{
名称=p.名称,
HasRenewedPassword=//此人是否在过去24小时内更新了密码?
}
}
}
所以我的问题是,如果个人是否更新了密码,我如何在selectnew{…}中返回
感谢所有的帮助!
我愿意接受任何其他解决这个问题的建议。试试看
select new Person
{
Name = p.Name,
HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalHours <= 24
}
选择新人
{
名称=p.名称,
HasRenewedPassword=(DateTime.Now-p.LastRenewedPassword)。TotalHours听起来像是您想要的:
// As noted in comments, there are serious problems with this approach
// unless you store everything in UTC (or local time with offset).
DateTime renewalCutoff = DateTime.UtcNow.AddHours(-24);
using(var context = Entities())
{
var persons = from p in context.Persons
select new Person
{
Name = p.Name,
HasRenewedPassword = p.LastRenewedPassword > renewalCutoff
};
}
var cutoff = DateTime.Now.AddDays(-1);
...
select new Person
{
Name = p.Name,
HasRenewedPassword = p.PasswordChanged >= cutoff
}
(通过在客户端对DateTime.Now
进行一次评估,随时调试正在发生的事情可能会更容易——例如,您可以记录该查询参数。)
请注意,由于您只进行投影,因此可以稍微简化代码:
var persons = context.Persons.Select(p => new Person {
Name = p.Name,
HasRenewedPassword = p.LastRenewedPassword > renewalCutoff
});
我猜是这样的:
// As noted in comments, there are serious problems with this approach
// unless you store everything in UTC (or local time with offset).
DateTime renewalCutoff = DateTime.UtcNow.AddHours(-24);
using(var context = Entities())
{
var persons = from p in context.Persons
select new Person
{
Name = p.Name,
HasRenewedPassword = p.LastRenewedPassword > renewalCutoff
};
}
var cutoff = DateTime.Now.AddDays(-1);
...
select new Person
{
Name = p.Name,
HasRenewedPassword = p.PasswordChanged >= cutoff
}
您可以使用时间跨度:
HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalHours <= 24
hasrenededpassword=(DateTime.Now-p.lastrenededpassword)。TotalHours您可以通过在select中添加一个简单条件来设置此值,该条件检查自密码续订以来已过的小时/天数。使用时间跨度来验证已过的时间,如下所示:
var persons = from p in contex.Persons
select new Person
{
Name = p.Name,
HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalDays > 1;
}
谢谢你的回答!我知道我很接近,但不知道有多接近;)学究:这和马克的答案在DST更改期间会不会稍微失败(如果你不使用UtcNow的话)?我认为DateTime不会调整。也就是说,它在技术上违反了Erik的要求(尽管它可能符合他的要求)@Brian:如果存储的值不是UTC格式,那么我不确定这是否可以修复。基本上不应该存储本地时间,至少不应该没有偏移:)@JonSkeet:我认为您可以通过小心使用来修复它,但这会使代码更复杂。如果您想在任何时间使用它,而不是在很短的时间内使用它,也有一些特定于XP的丑陋之处日期时间的范围。现在为
,因为它被编码为始终使用当前调整规则,而不是特定于该日期的调整规则。还有其他问题(例如,确保使用正确的当前区域性)@Brian:很高兴有人读到:)我编辑了这篇文章来强调UTC的重要性。@George我想我很久以前就输了那场比赛;p