2011-10-10 31 views
7

Tôi có một bảng người chứa đầy thông tin về Người. Tôi muốn có được một danh sách của người bên trong bảng và kiểm tra xem họ đã đổi mật khẩu của họ trong 24 giờ qua chưa, và sau đó trả lại tên người và thuộc tính boolean cho dù họ có cập nhật mật khẩu hay không.Boolean bên trong Chọn()

Đây là bảng Person:

Person bảng:

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

Vì vậy, câu hỏi của tôi là như thế nào tôi có thể, bên trong chọn mới {...} trả lại nếu người đó đã gia hạn mật khẩu hay không?

Tất cả trợ giúp đều được đánh giá cao! Và tôi sẽ mở cho bất kỳ đề xuất nào khác về giải pháp cho vấn đề này.

Trả lời

8

Âm thanh như bạn muốn một cái gì đó như:

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

(Bằng cách đánh giá DateTime.Nowlần và ở phía client, nó có khả năng để được dễ dàng hơn để gỡ lỗi những gì đang xảy ra tại bất kỳ lúc nào - bạn có thể ghi lại tham số truy vấn đó, chẳng hạn.)

Lưu ý rằng khi bạn chỉ đang thực hiện một dự án trên, bạn có thể đơn giản hóa mã của bạn một chút:

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

Cảm ơn câu trả lời! Tôi biết tôi đã gần, nhưng không biết làm thế nào gần;) –

+0

Pedantic: Không phải cả hai điều này và câu trả lời của Marc thất bại một chút trong những thay đổi DST (nếu bạn không sử dụng UtcNow)? Tôi không nghĩ rằng DateTime điều chỉnh cho điều đó. Đó là, nó * về mặt kỹ thuật * vi phạm yêu cầu của Erik (mặc dù nó có thể làm những gì anh ta muốn). – Brian

2

Hãy thử

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

Vâng, tôi đoán cái gì đó như:

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 Tôi nghĩ rằng tôi đã thua trận chiến đó một thời gian dài ***; –

0

Bạn có thể sử dụng một TimeSpan:

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

Bạn có thể đặt giá trị này bằng cách thêm điều kiện đơn giản vào lựa chọn của bạn để kiểm tra số giờ/ngày đã trôi qua tội lỗi ce mật khẩu đã được gia hạn. Sử dụng một khoảng thời gian để xác nhận thời gian trôi qua, như thế này:

var persons = from p in contex.Persons 
       select new Person 
       { 
        Name = p.Name, 
        HasRenewedPassword = (DateTime.Now - p.LastRenewedPassword).TotalDays > 1; 
       } 
Các vấn đề liên quan