2017-04-04 78 views
-1

我是Linq的新手,需要一些帮助。事实上,我甚至不确定这是可能的。鉴于样本数据:有多个计数器的Linq查询

WarehouseId  Sku  Dropship QtyOrdered  QtyAvaliable 
================================================================= 
1    ABC-123     1    6 
2    ABC-123     1    2 
3    ABC-123     1    0 
1    XYZ-789     2    11 
2    XYZ-789     2    1 
3    XYZ-789     2    3 
1    JKL-456 Y    1    0 
2    JKL-456 Y    1    0 
3    JKL-456 Y    1    1 

我试图确定股票的订单项目总数的每个仓库,都为所有订单项目,订单兵船没有物品。所以我正在寻找的输出是这样的:

WarehouseId: 1, 
QtyInStock: 2, 
QtyNonDropship: 2 

WarehouseId: 2, 
QtyInStock: 1, 
QtyNonDropShip: 1 

WarehouseId: 3, 
QtyInStock: 2, 
QtyNonDropship: 1 

我已经启动了一个Linq查询,但不知道如何做计数器。我很确定我需要某个地方的GroupBy

var results = (from o in orderItems 
       where o.QtySellable >= o.QtyOrdered // <-- add '1' to QtyInStock 
       || (o.QtySellable >= o.QtyOrdered && o.Dropship != 'Y')// <-- add '1' to QtyNonDropShip 
       select new 
       { 
        WarehouseId, 
        QtyInStock += QtyInStock 
        QtyNonDropShip += QtyNonDropShip 
       }).ToList(); 
+1

能否请你解释你是如何得到这些值:'WarehouseId:1, QtyInStock:2,QtyNonDropship:2' - 你有总的可用数量'6 + 11 + 0 = 17',这个值不会出现在输出中。您也正在查询中使用字段'QtySellable',这在示例数据中不存在 –

+0

我并不试图计算库存中可用项目的数量,我正在计算库存中的项目。例如在数据集中,有3个sku项目和3个仓库。对于每个仓库的每个SKU,请检查该物品是否有库存。如果'QtyOrdered> = QtyAvailable',则添加一个计数器。该项目有现货。 – PixelPaul

+0

对于第一个仓库,只有一个项目的'QtyOrdered> = QtyAvailable'。但在输出你显示'QtyInStock:2' –

回答

1

你需要按WarehouseId

var results = from o in orderItems 
       group o by o.WarehouseId into g 
       select new { WarehouseId=g.Key, 
          QtyInStock=g.Count(e=>e.QtySellable >= e.QtyOrdered), 
          QtyNonDropShip =g.Count(e=>e.QtySellable >= e.QtyOrdered && e.Dropship != "Y") 
         }; 
+0

这会给你'QtyInStock'等于3的第一个仓库。 OP执行它为2 –

+0

毫米权利,让我解决,谢谢 – octavioccl

+0

完美!正是我在找的,谢谢! – PixelPaul