当日期和ID不在同一顺序时,库存变动的累计总和

时间:2014-11-18 14:14:48

标签: c# linq cumulative-sum

我根据发货单日期计算库存变动的累计总和

IQueryable<StokHareketCumulative> query =
        from stockMovement1 in ce.StockMovements
        from stockMovement2 in ce.StockMovements
        join stock in ce.Stocks on stockMovement1.StokId equals stock.Id
        where 
         stockMovement1.StockId == stockMovement2.StockId && 
         stockMovement1.ShippingBill.Date >= stockMovement2.ShippingBill.Date //(last_line)
        ...

但是,可能有多个发货日期具有相同的值

在这种情况下,我试图在比较中添加库存移动ID。

//last_line goes

(stockMovement1.ShippingBill.Date == stockMovement2.ShippingBill.Date ?   
stockMovement1.ShippingBill.Date >= stockMovement2.ShippingBill.Date && stockMovement1.Id >= stockMovement2.Id 
: stockMovement1.ShippingBill.Date >= stockMovement2.ShippingBill.Date)  

但我没有正确的计算。

如何才能正确计算?

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

您的问题是您的日期字段没有足够的粒度来在该字段上正确排序。这里发生的是,如果你对某个字段进行排序,默认情况下它会在出现冲突时在排序之前保持顺序。

您已经尝试使用

来缓解此问题
(stockMovement1.ShippingBill.Date == stockMovement2.ShippingBill.Date ?   
stockMovement1.ShippingBill.Date >= stockMovement2.ShippingBill.Date && stockMovement1.Id >= stockMovement2.Id 
: stockMovement1.ShippingBill.Date >= stockMovement2.ShippingBill.Date)

我建议另一个解决方案:

stockMovement1.ShippingBill.Date > stockMovement2.ShippingBill.Date || stockMovement1.Id > stockMovement2.Id 

如果已知解决方案,则使用C#OR运算符函数提前返回。如果Date1晚于Date2,则立即返回true,不再进一步计算。如果不是这种情况(如此假),如果Id1大于Id2,则返回true,否则返回false。我认为Id显然是独一无二的。

事实上,如果Id是唯一的并且使用递增器自动编号,那么总是与Id进行比较会更好:

stockMovement1.Id > stockMovement2.Id

因为自动增量Id表示第N天的项目总是比第N-1天的数字更高,这意味着按ID排序也按时间顺序排序。