2017-02-27 8 views
0

私のアプリケーションの目的は、基準に基づいてレコードを取得することです。.NET Entity Framework過去1分間に更新されたレコードを選択する方法は?

問題は数百万のレコードが存在する可能性がありますが、最近1分間に更新されたレコードのみを選択したいということです。

最初にすべてのレコードを選択しますが、1分後には非常に長い時間がかかるため、すべてをもう一度選択することはできません。私はその期間内に更新された注文を選択したいだけです。

var records = context.Orders.Where(x => x.Category == "GAMING"); 

私にできることはありますか?いくつかの種類のデータベースイベントを購読しますか?

var minuteAgo = DateTime.Now.AddMinutes(-1); 
var recordsThisMinute = context.Orders.Where(x => x.DateInserted >= minuteAgo && x.Category == "GAMING"); 

ただし、必要に応じて生成する:その値に基づいて

+2

「更新日時」列はありますか? –

+0

@ DanielA.Whiteいいえ、私はしません。 –

+4

従来のrdbmsの場合は、そのOrderテーブルにタイムスタンプカラムを追加し、その上にインデックスを作成し、単にタイムスタンプ> = now() - 1分を選択してください。 – quetzalcoatl

答えて

1

最も効率的なタイムスタンプ(ex.DateInserted)に開催された日時列を含むことによりだろうこれを行う方法、およびフィルタリング同じ結果は、テーブルに触れることなく、いつでも次のことを試みることができる:

//Assuming oldRecords is the variable in which 
//you're storing the records you selected a minute ago 
var recordsThisMinute = context.Orders.Where(x => x.Category == "GAMING").Except(oldRecords); 
+0

Sql Serverで作業している場合、 'timestamp'という単語に注意してください。タイムスタンプの型がありますが、時間とは関係ありません。後のバージョンでは 'rowversion'に名前を変更しましたが、timestampキーワードは後方互換性のために残されています。私はあなたの最初の文章の言い回しを "タイムスタンプを保持するdatetimeカラムを含めることでこれを行う最も効率的な方法"に変更します* –

+0

大きなポイント - それに応じて更新:) –

0

は多分あなたが過負荷オフSaveChangesメソッドで管理idOrder、あなたのDbContextの日時の静的Dictionnaryを使用することができます。

public static IEnumarable<Order> GetLastUpdatedOrder() 
{ 
//Return dictionnay here 
} 
public override int SaveChanges() 
{ 
    var updatedOrder = ChangeTracker.Entries<Order>().Where(o => o.State == EntityState.Modified).ToList(); 
    //Manage here Your dictionnary 
    var i = base.SaveChanges(); 
    return i; 
} 
関連する問題