Linq GROUP& SUM来自不同表的相同列

时间:2014-06-27 16:44:32

标签: linq group-by ef-code-first sum

我正在尝试将这2个Linq查询合并为1:

var query = from s in _context.Set<StockInventoryItem>()
                        where s.StockCatalogueItemId == id
                        group s by s.StockType  into g
                        select new
                        {
                            inStock = g.Sum(x => x.QtyInStock),
                        };

        var query2 = from p in _context.Set<PurchaseOrderItem>()
                     where p.StockCatalogueItemId == id
                     group p by p.StockType into g2
                     select new
                     {
                         onOrder = g2.Sum(x => x.QtyStillDue)
                     };

请注意,两个表的过滤,分组和输出是相同的,我希望结果如下所示:

 StockType  inStock  onOrder
+----------+--------+--------+
  Type 1      4        3
+----------+--------+--------+
  Type 2      0        1

即。数量按StockType

分组

这首先是EF代码,这些表之间没有直接关系,这就是为什么我在服务层尝试这个查询所以我可以访问这两个实体。

1 个答案:

答案 0 :(得分:1)

你应该能够&#34; shoehorn&#34;两个组使用匿名类型和Concat进入相同的序列,然后分别计算结果,如下所示:

var query = _context.Set<StockInventoryItem>()
    .Where(ii => ii.StockCatalogueItemId == id)
    .Select(ii => new {
        II = ii, PO = (PurchaseOrderItem)null
    }).Concat(_context.Set<PurchaseOrderItem>()
    .Where(po => po.StockCatalogueItemId == id)
    .Select(po => new {
        II = (StockInventoryItem)null, PO = po
    })).GroupBy(p => II != null ? ii.StockType : PO.StockType)
    .Select(g => new {
        InStock = g.Sum(p => p.II != null ? p.II.QtyInStock : 0)
    ,   OnOrder = g.Sum(p => p.PO != null ? p.PO.QtyStillDue: 0)
    });