【问题标题】:Boolean inside of Select()Select() 内部的布尔值
【发布时间】:2011-10-10 14:40:27
【问题描述】:

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

这是我的 Person 表:

人员表:

varchar(30) Name,
DateTime LastRenewedPassword.

代码:

public class Person
{
     public string Name { get; set; }
     public boolean HasRenewedPassword { get; set; }
}

public List<Person> GetPersons()
{
    using(var context = Entities())
    {
        var persons = from p in contex.Persons
                      select new Person
                      {
                          Name = p.Name,
                          HasRenewedPassword = // Has the personer renewed the password   for the last 24 hours?
                      }
    }
}

所以我的问题是,如果用户已更新密码,我如何在 select new {...} 内返回?

感谢所有帮助! 我愿意接受任何其他解决此问题的建议。

【问题讨论】:

    标签: c# .net linq entity-framework linq-to-entities


    【解决方案1】:

    听起来你想要这样的东西:

    // 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
                      };
    }
    

    (通过在客户端评估DateTime.Now一次,随时可以更轻松地调试正在发生的事情 - 例如,您可以记录该查询参数。)

    请注意,由于您只是进行投影,因此可以稍微简化代码:

    var persons = context.Persons.Select(p => new Person {
                      Name = p.Name,
                      HasRenewedPassword = p.LastRenewedPassword > renewalCutoff
                  });
    

    【讨论】:

    • 感谢您的回答!我知道我很接近,但不知道有多接近;)
    • Pedantic:在 DST 更改期间,这和 Marc 的答案都不会稍微失败(如果您不使用 UtcNow)?我不认为 DateTime 会为此进行调整。也就是说,它在技术上违反了 Erik 的要求(尽管它可能满足他的要求)。
    • @Brian:如果存储的值不是 UTC,那么我不确定这是否可以修复。基本上不应该存储当地时间,至少没有偏移量:)
    • @JonSkeet:我认为您可以通过仔细使用IsDaylightSavingsTime 来修复它,但这会使代码更加复杂。如果您想在除DateTime.Now 附近的日期以外的任何日期使用它,也会有一些特定于 XP 的丑陋,因为它被编码为始终使用当前的调整规则,而不是特定于该日期的调整规则。还有其他问题(例如,确保使用正确的当前文化)。
    • @Brian:很高兴有人阅读 :) 编辑了帖子以强调 UTC 的重要性。
    【解决方案2】:

    嗯,我猜测类似于:

    var cutoff = DateTime.Now.AddDays(-1);
    ...
     select new Person
      {
          Name = p.Name,
          HasRenewedPassword = p.PasswordChanged >= cutoff
      }
    

    【讨论】:

    • @George 我想我在 很久 之前输掉了那场战斗;p
    【解决方案3】:

    试试

    select new Person
    {
             Name = p.Name,
             HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalHours <= 24
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用 TimeSpan:

      HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalHours <= 24
      

      【讨论】:

        【解决方案5】:
        var renewalTime = DateTime.Now.Substract(new TimeSpan(24,0,0));
        
        // insert in the select code
        HasRenewedPassword = p.LastRenewedPassword > renewalTime
        

        【讨论】:

          【解决方案6】:

          您可以通过向您的选择添加一个简单条件来设置此值,该条件检查自更新密码以来已经过去了多少小时/天。使用时间跨度来验证经过的时间,如下所示:

          var persons = from p in contex.Persons 
                        select new Person 
                        { 
                            Name = p.Name, 
                            HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalDays > 1;
                        } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-13
            • 2021-07-26
            • 2012-05-09
            • 2014-03-20
            • 2011-12-08
            • 2021-03-01
            相关资源
            最近更新 更多