2011-10-24 2 views
0

私は、クエリLinq-to-EntitiesクエリでDateTime.AddXXXX関数を使用するにはどうすればよいですか?

List<Entities.Subscriber> items = (from s in context.Subscribers 
       where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < DateTime.Now.AddMonths(-1) 
       select s).ToList(); 

AddMonthsを使用しようとしています。しかし、私はエラーを受け取る:エンティティへ

LINQは方法 'のSystem.DateTime AddMonths(のInt32)' を認識しない方法で、このメソッドをストア式 に変換することはできません。

私のクエリの中でこの機能を使用する方法はありますか?読み出し可能IMO

DateTime limit = DateTime.Now.AddMonths(-1); 

List<Entities.Subscriber> items = (from s in context.Subscribers 
      where s.Validated == false && s.ValidationEmailSent == true && 
              s.SubscriptionDateTime < limit) 
      select s).ToList(); 

以上:

答えて

6

これまで最も簡単な修正プログラムは、LINQを使用して前たら、時間制限をうまくすることです

var items = context.Subscribers 
        .Where(s => !s.Validated && 
           s.ValidationEmailSent && 
           s.SubscriptionDateTime < limit) 
        .ToList(); 

クエリ式を使用しても利点はありませんtruefalseとの明示的な比較は、醜いIMOです(あなたのプロパティのタイプがNullable<bool>の場合を除き)。

+1

DateTime.Nowで作業している場合はこれで問題ありません。しかし、月を追加してs.SuscriptionDateTimeの値を処理する必要がある場合は、Aniの回答が優れています。 – Romias

+0

@Romias:その場合、別の質問に答えるだろう:) –

+0

haha​​ ...あなたは正しい...私は私の問題を考えてコメントしました:) – Romias

0

あなたは、あなたにコードを変更することができますAddMonthはエンティティへのLINQでSQLに変換することができない.NET機能であるため、これを実行する必要が

DateTime oneMonth = DateTime.Now.AddMonths(-1) 
    List<Entities.Subscriber> items = (from s in context.Subscribers 
        where s.Validated == false && s.ValidationEmailSent == true && s.SubscriptionDateTime < oneMonth 
        select s).ToList(); 

。コード内で計算を実行し、結果として得られる日時を使用します。

5

Jon Skeetはすでに簡単な修正を行っていますが、DateTime.Now.AddMonthsビットをデータベースで実行する場合はEntityFunctions.AddMonthsメソッドを試してみてください。

これは、より安価に、またはクライアントで式を正しく複製できない場合に特に便利な、より一般的なアプローチです。

関連する問題