2011-10-10 11 views
7

Mam tabelę osób wypełnioną informacjami o osobie. Chciałbym uzyskać listę osób w tabeli i sprawdzić, czy odnowili swoje hasło w ciągu ostatnich 24 godzin, a następnie zwrócić nazwisko osoby i wartość boolowską, czy zaktualizowali hasło, czy nie.Boolean wewnątrz funkcji Select()

To jest mój stół Osoba:

Person tabela:

varchar(30) Name, 
DateTime LastRenewedPassword. 

Kod:

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

Więc moje pytanie brzmi jak mogę, wewnątrz select new {...} zwrócić, jeśli osoba prywatna odnowiła hasło, czy nie?

Cała pomoc jest przydatna! I jestem otwarty na wszelkie inne sugestie dotyczące rozwiązania tego problemu.

Odpowiedz

8

Brzmi jak chcesz coś takiego:

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

(Oceniając DateTime.Nowraz i po stronie klienta, to może być łatwiejsze do debugowania, co się dzieje w w dowolnym momencie - na przykład możesz zarejestrować parametr zapytania).

Pamiętaj, że ponieważ robisz tylko projekt na, można uprościć kod nieco:

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

Dzięki za odpowiedź! Wiedziałem, że jestem blisko, ale nie wiedziałem, jak blisko;) –

+0

Pedantyczny: czy to samo, jak i odpowiedź Marca, nie ulegną zmianie podczas zmian czasu letniego (jeśli nie używasz UtcNow)? Nie sądzę, aby DateTime dostosowało się do tego. Oznacza to, że * technicznie * narusza wymóg Erika (chociaż prawdopodobnie robi to, co chce). – Brian

2

Spróbuj

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

Cóż, mam zgadywania coś takiego:

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 Myślę, że przegrałem tę walkę *** długi czas temu; p –

0

Można użyć Okres:

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

Możesz ustawić tę wartość, dodając prosty warunek do wyboru, który sprawdza, ile godzin/dni upłynęły grzech ce hasło zostało odnowione. Użyj żądany przedział czasu, aby potwierdzić czas, który upłynął, tak:

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