オブジェクトのリストを読みましたがVehicleMovementEvent
、そのほとんどは駐車場ゾーンへの単純な出入り口です。これらには、入口または出口のインジケータと、日付と時刻があります。VehiclePresence
このリストを使用して、車両が開始時刻から終了時刻までゾーン x に存在していたことを示すオブジェクトのリストを生成します。これは、2 つの一致するVehicleMovementEvent
オブジェクトから収集されます。リスト全体を処理するか、何も処理しないようにしたいので、トランザクションが適しているようです。
コードでトランザクションを使用することはあまりありません。特に分離レベルなどについて。
var opts = new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead, Timeout = new TimeSpan(0, 0, 10, 0) };
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, opts))
{
var vehicleMovements = startsbatch.Movements
.Where(m => m.MovementType.Direction == VehicleMovementEventType.Entry)
.OrderBy(m => m.EmpNo)
.ThenBy(m => m.MovementDateTime);
presenceBatch.StartDateTime = DateTime.Now;
presenceBatch.MovementBatch = startsbatch;
_dbContext.VehiclePresenceBatches.Add(presenceBatch);
_procTrace.TraceInformation("New VehiclePresencesBatch created. Id: {0}.", presenceBatch.Id);
foreach (var movement in vehicleMovements)
{
var presence = new VehiclePresence
{
PresenceBatch = presenceBatch,
EmpNo = movement.EmpNo,
Location = movement.Location,
StartDateTime = movement.MovementDateTime,
StartMovementBatchId = movement.BatchId,
StartMovementLineId = movement.LineId,
StartMovementId = movement.Id
};
_dbContext.VehiclePresences.Add(presence);
returnList.Add(presence);
}
_dbContext.SaveChanges();
scope.Complete();
_procTrace.TraceInformation("{0} VehicleMovements processed. {1} VehiclePresences created", vehicleMovements.Count(), returnList.Count);
}