2012-04-23 8 views
2

私は以下を試しました(明らかに//なし)が、何もできません。誰でも助けてくれますか?Linq DateTimeフィールドがX時間より古い場合

public void CleanBasket() 
    { 
     //double validHours = 3; 
     // var expired = (from a in db.Baskets where (DateTime.Now - a.DateCreated).TotalHours > validHours select a); 
     //var expired = (from a in db.Baskets where (DateTime.Now.Subtract(a.DateCreated).Hours > 3) select a); 
     //var expired = (from a in db.Baskets where(a => a.DateCreated > DateTime.Now.AddHours(-1)); 
     //foreach (Basket basket in expired) db.DeleteObject(expired); 
     db.SaveChanges(); 
    } 
+1

何が問題なのですか?コンパイル時にエラーが発生していますか?ランニング?正しい結果が得られないのでしょうか? – aqwert

+3

私はこの質問に答えようとしましたが、私は答えを得ることができませんでした。 –

+0

これは機能しますか? 'var dt = DateTime.Now.AddHours(-3); var expired = from a db.Baskets where a.DateCreated dtb

答えて

11

確かにLINQ起動する前に、あなたは単にあなたの日付時刻の計算を行うことができます:あなたは、データベースに行う必要があり、この方法、あなたを行うことができない任意のより複雑なのDateTime操作について

double validHours = 3; 
var latest = DateTime.UtcNow.AddHours(-validHours); 
var expired = (from a in db.Baskets where a.DateCreated < latest select a); 

SqlFunctionsを使用できます。

ところで、あなたの時間は現地時間ではなく、Utcで保存してください。 DateTime.Nowを使用した計算は、夏時間の変更中は間違っています。

+0

** DateTime.Utc **の代わりに** DateTime.UtcNow **を使用しなければなりませんでした。これがバージョニングの問題であるかどうか、または回答を更新する必要があるかどうかは不明です。 –

1

私の推測では、LINQツーエンティティがDateTime.Now操作でクエリを策定方法を知らないということです。これを行うには、私はリストの値を取得し、ちょうどlinqで、それらをフィルタリングします。

public void CleanBasket() 
    { 
     var cutoff = DateTime.Now.Subtract(new TimeSpan(3, 0, 0)); 
     var baskets = db.Baskets.Where(a=>a.DateCreated<cutoff); 
     db.DeleteObjects(baskets); // You can combine this with the last line 
     db.SaveChanges(); 
    } 
+0

あなたは人々にこれをするよう奨励すべきではありません。 1つのクエリで返される数百のレコードを持つ生産でクラッシュするまで、すべてのテストで正常に動作します... – Pedro

+0

@Pedro - 彼はLinq-To-Efでサーバー上でSPROCを呼び出さずにこれを実行したい場合、 Linq-To-Efがタイムスパンを有効なクエリに変換できるかどうかはわかりません。 – Matt

+1

@ペドロ、私は実際に両方の世界の最高のカットオフ日付を計算するように変更しました。 – Matt

1

ORMは文句を言わない、のTimeSpanの操作を変換することができ、それが役に立つことができ、この質問をチェックしている可能性が高いです。Comparing dates in query using LINQ

基本的にあなたが使用している方法はしていない場合と考えることができますSQLへのリテラル変換がサポートされていない可能性が非常に高いです。この場合

関連する問題