7

私は次のことを試しましたが(明らかに//なしで)、何も動作させることができません。誰か助けてもらえますか?

    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();
    }
4

3 に答える 3

17

この場合、LINQを呼び出す前に、日時の計算を簡単に行うことができます。

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

データベースで実行する必要があり、この方法では実行できない、より複雑なDateTime操作については、SqlFunctionsを使用できます。

ところで、現地時間ではなく協定世界時で時間を保存する必要があります。DateTime.Now夏時間の変更中は、を使用した計算が間違っています。

于 2012-04-24T00:18:45.163 に答える
2

私の推測では、linq-to-entitiesは、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();
    }
于 2012-04-24T00:06:35.500 に答える
1

ORMがTimeSpan操作を変換できない可能性が非常に高いので、次の質問を確認してください。LINQを使用したクエリでの日付の比較

基本的に、使用しているメソッドにSQLへの直訳がない場合、サポートされない可能性が非常に高いと考えることができます。

于 2012-04-24T00:13:30.943 に答える