我根据发货单日期计算库存变动的累计总和
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)
但我没有正确的计算。
如何才能正确计算?
答案 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排序也按时间顺序排序。