2011-10-10 11 views
7

Ho una tabella di persone piena di informazioni sulla persona. Vorrei ottenere un elenco di persone all'interno del tavolo e controllare se hanno rinnovato la loro password nelle ultime 24 ore, e quindi restituire un nome di persona e una proprietà booleana se hanno aggiornato la password o meno.Booleano all'interno di Select()

Questa è la mia tabella Person:

tavolo

Persona:

varchar(30) Name, 
DateTime LastRenewedPassword. 

Codice:

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

Quindi la mia domanda è: come posso io, dentro di selezionare nuovi {...} tornare se l'utente ha rinnovato la password o no?

Tutti gli aiuti sono apprezzati! E sono aperto a qualsiasi altro suggerimento per risolvere questo problema.

risposta

8

Sembra che si desidera qualcosa di simile:

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

(Valutando DateTime.Nowvolta e al lato client, è probabile che sia più facile per eseguire il debug quello che sta succedendo a in qualsiasi momento, ad esempio, è possibile registrare tale parametro di query.

Nota che come stai solo facendo un projecti on, è possibile semplificare il codice un po ':

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

Grazie per la risposta! Sapevo di essere vicino, ma non sapevo quanto fosse vicino;) –

+0

Pedante: la risposta di Marc e di Marc non fallirà leggermente durante le modifiche all'ora legale (se non usi UtcNow)? Non penso che DateTime si aggiusti per quello. Cioè, * tecnicamente * viola il requisito di Erik (anche se probabilmente fa ciò che vuole). – Brian

2

Prova

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

Beh, sto cercando di indovinare qualcosa di simile:

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 Penso di aver perso quella battaglia un *** lungo *** tempo fa; p –

0

È possibile utilizzare un periodo:

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

È possibile impostare questo valore aggiungendo una semplice condizione alla selezione che controlla quante ore/giorni sono trascorsi sin ce la password è stata rinnovata. Utilizzare un periodo per convalidare il tempo trascorso, in questo modo:

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