Erik Larsson
Erik Larsson

Reputation: 2709

Boolean inside of Select()

I have a person table filled with Person information. I would like to get a list of the personer inside the table and check if they have renewed thier password in last 24 hours, and then return a person name and a boolean property whether they have updated the password or not.

This is my Person table:

Person table:

varchar(30) Name,
DateTime LastRenewedPassword.

Code:

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?
                      }
    }
}

So my question is how can I, inside of select new {...} return if the personer have renewed the password or not?

All help is appriciated! And I´m open for any other suggestions for solution to this problem.

Upvotes: 7

Views: 200

Answers (6)

Jon Skeet
Jon Skeet

Reputation: 1502086

Sounds like you want something like:

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

(By evaluating DateTime.Now once and at the client side, it's likely to be easier to debug what's going on at any time - you can log that query parameter, for example.)

Note that as you're only doing a projection, you can simplify your code a bit:

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

Upvotes: 8

James Johnson
James Johnson

Reputation: 46067

You can set this value by adding a simple condition to your select that checks how many hours/days have elapsed since the password was renewed. Use a timespan to validate the elapsed time, like this:

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

Upvotes: 0

Bjorn Coltof
Bjorn Coltof

Reputation: 509

var renewalTime = DateTime.Now.Substract(new TimeSpan(24,0,0));

// insert in the select code
HasRenewedPassword = p.LastRenewedPassword > renewalTime

Upvotes: 0

Joe
Joe

Reputation: 82624

You can use a TimeSpan:

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

Upvotes: 0

Marc Gravell
Marc Gravell

Reputation: 1063338

Well, I'm guessing something like:

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

Upvotes: 7

Bala R
Bala R

Reputation: 108967

Try

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

Upvotes: 2

Related Questions