2011-10-10 13 views
7

PersonテーブルにPerson情報が入力されています。私はテーブルの中の人格のリストを取得し、最後の24時間で彼らのパスワードを更新しているかどうかを確認し、パスワードを更新したかどうかにかかわらず人名とブール値のプロパティを返します。Select()内のブール値

Personテーブル:

この

は、私のPersonテーブルである

varchar(30) Name, 
DateTime LastRenewedPassword. 

コード:

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

だから私の質問はどのようにすることができます私は、内部の選択新しいです{...}人がパスワードを更新したかどうかを返しますか?

すべてのヘルプはappriciatedです! 私はこの問題を解決するための他の提案をしています。

答えて

8

あなたが何かしたいような音してみてください。一度DateTime.Nowを評価することにより

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

を(クライアント側では、それはで何が起こっているのかをデバッグしやすくなる可能性が高いのですがいつでも、クエリパラメータを記録することができます)。

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

ありがとう:このように、経過時間を検証するタイムスパンを使用してください! –

+0

Pedantic:これとMarcの回答は、DSTの変更中に少しでも失敗しません(あなたがUtcNowを使用していない場合)。私はそれについてDateTimeが調整するとは思わない。つまり、技術的に*エリックの要求に違反している(おそらく彼が望むことはしているが)。 – Brian

2

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

まあ、私はのような何かを推測している:

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

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

+0

@George私はその戦いを失ったと思う***長い***時間前; p –

0

あなたがのTimeSpanを使用することができます:

var persons = context.Persons.Select(p => new Person { 
        Name = p.Name, 
        HasRenewedPassword = p.LastRenewedPassword > renewalCutoff 
       }); 
0
var renewalTime = DateTime.Now.Substract(new TimeSpan(24,0,0)); 

// insert in the select code 
HasRenewedPassword = p.LastRenewedPassword > renewalTime 
0
に、あなたは少しあなたのコードを簡素化することができます

この値を設定するには、selectに単純な条件を追加して、経過した時間/日数を確認しますパスワードが更新されました。

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