2016-05-30 8 views
0

データベースに予約テーブルがあり、そのうちの1つがbooking_date_timeです。複数のレコードの時間部分を更新するにはどうすればよいですか?たとえば、異なる日付の5つのレコードがある場合、それらの日付を保持したいが、午前10時に設定する。 以下は私が使用しているコードですが、これはすべてのオブジェクトに対して同じ日付を設定します。私は、オブジェクトのリストを取得し、それらを反復処理し、時間.net linq update time複数のレコードのdatetime部分

booking bookingToUpdate = db.bookings.Where(a => a.booking_recurrence_id == bk.booking_recurrence_id).SingleOrDefault(); 
bookingToUpdate.booking_date_time = bk.booking_date_time; 
db.Entry(bookingToUpdate).State = System.Data.Entity.EntityState.Modified; 
retVal = db.SaveChanges() > 0; 

入力データが1つの予約レコード(BK)であるでそれらを1つずつ更新避けるために願っています。これには一意のbooking_idが含まれています。また、複数の予約をリンクするbooking_recurrence_idも含まれています。

booking_id:1 booking_recurrence_id:1 booking_date_time:2016年1月1日午前8時00

booking_id:2 booking_recurrence_id:1 booking_date_time:2016年2月1日

は、私は以下の持っていると言います 午前8時

booking_id:3 booking_recurrence_id:1 booking_date_time:2016年3月1日午前8時

私の期待する結果が

booking_idする必要がありますので、私は、9:00に時刻を更新したい:1 booking_recurrence_id:1 booking_date_time:2016年1月1日9時00

booking_id:2 booking_recurrence_id:1 booking_date_time:2016年2月1日午前9時00分

booking_id:3 booking_recurrence_id:1 booking_date_time:2016年3月1日午前9時00分

+0

かかわらテストされていません、これを試してみてください? –

+0

[DateTime](https://msdn.microsoft.com/en-us/library/system.datetime%28v=vs.110%29.aspx)には、「AddHours」メソッドが含まれています。これを使って! –

答えて

1

EF(または他のORM)を使用して更新する方法は、オブジェクトを取得し、更新してから変更を送信することです。

バッチ更新を行う可能性のある拡張機能は複数ありますが、各行の値に基づいて更新する必要があるため、すべての行を一定の値に更新する必要があるため、

ただし、あなたは1回の提出を行い、あなたのケースでは1回の選択も行うことができます。しかし、これはオブジェクトの数に基づいていくつかの更新ステートメントを生成します。オブジェクトのリスト上のローカル

  1. あなたは(1往復)を更新したいすべてのrecrodsを選択
  2. ループ。 (データベースへの移動なし)
  3. 各オブジェクトを更新します。 (データベースへの旅行)
  4. 変更(1往復、生成された複数の更新文)

を提出していない私はあなたがこれを行うには、SQL文への単一のLINQを生成することができるとは思いません。しかし、従来のT-SQLクエリを使用することができます。

List<int> ids = new List<int>(); // your ids here. 

string commaDelimitedIds = String.Join("," ids); 
string query = "UPDATE booking " 
+ "SET booking_date_time = DATEADD(HOUR, 10, CONVERT(DATETIME2(7), CONVERT(DATE, booking_date_time))) " 
+ "WHERE booking_recurrence_id IN (" + commaDelimitedIds + ")"; 

db.Database.SqlQuery(query); 
0

エンティティフレームワークを使用している場合は、Entity Framework Extended Libraryをご覧ください。バッチ更新機能 - これが必要です。各行は、その値に基づいて更新できます。

0

では、より具体的に、入力データと出力期待を提供することができ

bookingToUpdate.ToList().ForEach(m => {DateTime.Parse(m.booking_date_time.ToShortDateString() + " 09:00 AM")}) 
+0

注意してください!これにより、すべてのデータがローカルにメモリに取り込まれ、オブジェクトが更新されます。それは一般的に避けるべきです。 – user3185569

+0

@ user3185569任意のリファレンス...代替案を見たい –

関連する問題