使用List.ForEach执行操作时遇到问题

时间:2019-06-17 06:36:58

标签: c# linq

我们正在运行一个石英作业,以触发一条命令,该命令最终会在某些条件下每天更新n个订单的状态(到期和逾期)。 作业运行正常并每天触发命令,但是在执行操作(即更新订单状态)时,存在不一致 就像有一天会更新状态,而有一天会错过状态。

代码如下

CommandHandler处理来自作业的命令:

public void Handle(SetOrderProgressStatusUpdateCommand command)
    {
        var updater = new StatusUpdater(dbContext);

        updater.OrderPackageProgress.SetNewOverdue();
        updater.OrderPackageProgress.SetUpdatedOverdue();
        updater.OrderPackageProgress.SetSentOverdue();
        updater.MainComponentArrivalProgress.SetNotArrivedOverdue();
        updater.TagCompositionProgress.SetNotSecuredOverdue();
        updater.CounterSampleProgress.SetOrderedOverdue();
        updater.CounterSampleProgress.SetReceivedOverdue();
        updater.ProductionStartProgress.SetNotStartedOverdue();
        updater.ProductionSampleProgress.SetOrderedOverdue();
        updater.ProductionSampleProgress.SetReceivedOverdue();
        updater.ProductionStartProgress.SetNotStartedDue();
        updater.MainComponentArrivalProgress.SetNotArrivedDue();
        updater.OrderPackageProgress.SetCancelledNotSentOverdue();
        updater.OrderPackageProgress.SetCancelledSentOverdue();

        if (featureAccessManager.IsAvailable(FeatureKey.Deadlines))
        {
            updater.ProductionStartDateSetProgresss.SetDateNotSetOverdue();
            updater.ProductionStartDateSetProgresss.SetDateNotSetDue();                
            updater.MainComponentArrivalDateSetProgress.SetArrivalDateNotSetDue();
            updater.MainComponentArrivalDateSetProgress.SetArrivalDateNotsetOverdue();                
            updater.ProductionUnitProgress.SetAssignementInvalidDue();
            updater.ProductionUnitProgress.SetAssignementInvalidOverdue();
            updater.ProductionUnitProgress.SetNotAssignedDue();
            updater.ProductionUnitProgress.SetNotAssignedOverdue();
            updater.ProductionUnitProgress.SetQuantityDiffDue();
            updater.ProductionUnitProgress.SetQuantityDiffOverdue();
            updater.CounterSampleDateSetProgress.SetApprovedDateNotSetDue();
            updater.CounterSampleDateSetProgress.SetApprovedDateNotSetOverdue();
            updater.CounterSampleDateSetProgress.SetNotOrderedDue();
            updater.CounterSampleDateSetProgress.SetNotOrderedOverdue();
            updater.CounterSampleDateSetProgress.SetOrderedDue();
            updater.CounterSampleDateSetProgress.SetReceivedDue();
        }

    }

内部每种方法都有针对特定状态的过滤器和操作,例如:

public void SetNewOverdue()
        {
            Expression<Func<OrderProgressStatusUpdate, bool>> filter =
                x =>
                    x.Deadline.OrderPackageSentDueDate < StatusUpdater.Today &&
                    x.Status.OrderPackageProgressName == "New";
            Action<OrderProgressStatus> action = status => status.SetOrderPackageProgressNewOverdue();
            StatusUpdater.SetProgressOverdue(filter, action);
        }

That eventually calls the SetProgressOverdue method and that performs the actual action based on the filter.
Code inside that method looks like this :

    public static void SetProgressOverdue(Expression<Func<OrderProgressStatusUpdate, bool>> where, `enter code here`Action<OrderProgressStatus> action)
    {

       var orderProgressStatuses = dbContext.OrderProgressStatuses
       .Join(dbContext.OrderDeadlines, status => status.OrderId, deadline => deadline.OrderId,
           (status, deadline) => new OrderProgressStatusUpdate { Status = status, Deadline = deadline })
       .Where(where)
       .Select(x => x.Status).ToList();

       orderProgressStatuses.ForEach(action);

    }

示例:

调用SetNewOverdue()方法时,它将过滤器和操作发送到方法SetProgressOverdue(filter,action), 在基于过滤器的方法中,我们获取当天的合格订单并使用ForEach方法更新状态。 如果有10个SetNewOverdue订单,则ForEach方法将调用该动作(即SetOrderPackageProgressNewOverdue())10次。

我们有两个桌子 1.OrderProgressStatus:保持订单状态,如OrderProgressname和OrderProgressText 2.OrderDeadLine:保留“截止期限”详细信息,表示应该到期和逾期的DateTime。

让我们考虑: 我有一些OrderId,今天是截止日期,那么对于所有这些Orderid,状态应更改为Due(到期),明天(明天)更改为过期。

2C8B329A-73AB-4584-AD92-CC08E55D4CDF 3C8B329A-73AB-4584-AD92-CC08E55D4CDF 4C8B329A-73AB-4584-AD92-CC08E55D4CDF 5C8B329A-73AB-4584-AD92-CC08E55D4CDF 6C8B329A-73AB-4584-AD92-CC08E55D4CDF 7C8B329A-73AB-4584-AD92-CC08E55D4CDF 8C8B329A-73AB-4584-AD92-CC08E55D4CDF 6B8B329A-73AB-4584-AD92-CC08E55D4CDF AC8B329A-73AB-4584-AD92-CC08E55D4CDF GC8B329A-73AB-4584-AD92-CC08E55D4CDF 9C8B329A-73AB-4584-AD92-CC08E55D4CDF

获取数据后,我们将更新OrderProgressStatus表中每个orderId的状态

我们尝试处理异常(如果有的话),但一切似乎都很好 我们怀疑在高负载时它只是忽略了动作。

将提供一点帮助,在此先感谢。

0 个答案:

没有答案