Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Select()的内部布尔值_C#_.net_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# Select()的内部布尔值

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

我有一个人员表,其中填写了人员信息。我想获取表中的人员列表,检查他们是否在过去24小时内更新了密码,然后返回一个人名和一个布尔属性,无论他们是否更新了密码

这是我的个人表:

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