2011-10-10 13 views
7

Tengo una tabla de personas llena de información de Persona. Me gustaría obtener una lista de la persona que se encuentra dentro de la tabla y verificar si han renovado su contraseña en las últimas 24 horas, y luego devolver un nombre de persona y una propiedad booleana, ya sea que hayan actualizado la contraseña o no.Booleano dentro de Seleccionar()

Esta es mi mesa Persona:

mesa

Persona:

varchar(30) Name, 
DateTime LastRenewedPassword. 

Código:

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

Así que mi pregunta es ¿cómo puedo, dentro del selecto nueva {...} devolver si la persona ha renovado la contraseña o no?

¡Toda la ayuda ha sido solicitada! Y estoy abierto a cualquier otra sugerencia para solucionar este problema.

Respuesta

8

suena como usted quiere algo como:

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

(Evaluando DateTime.Nowvez y en el lado del cliente, es probable que sea más fácil de depurar lo que está pasando en el en cualquier momento, puede registrar ese parámetro de consulta, por ejemplo.)

Tenga en cuenta que como solo está haciendo un proyectoi activada, se puede simplificar el código un poco:

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

http://data.stackexchange.com/stackoverflow/s/1927/skeet-vs-gravell –

+0

Gracias por la respuesta! Sabía que estaba cerca, pero no sabía qué tan cerca;) –

+0

Pedante: ¿No fallarán un poco esto y la respuesta de Marc durante los cambios del horario de verano (si no usas UtcNow)? No creo que DateTime se ajuste a eso. Es decir, * técnicamente * viola los requisitos de Erik (aunque probablemente haga lo que quiera). – Brian

2

Trate

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

Bueno, estoy adivinando algo como:

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

http://data.stackexchange.com/stackoverflow/s/1927/skeet-vs-gravell –

+0

@George Creo que perdí esa pelea hace un buen rato ***; –

0

Se puede utilizar un intervalo de tiempo:

HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalHours <= 24 
0
var renewalTime = DateTime.Now.Substract(new TimeSpan(24,0,0)); 

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

Puede establecer este valor agregando una condición simple a su selección que verifica cuántas horas/días han transcurrido sin ce la contraseña fue renovada. Use un lapso de tiempo para validar el tiempo transcurrido, así:

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