2014-06-27 4 views
1

J'essaie de combiner ces 2 requêtes LINQ en 1:GROUP Linq et SUM les mêmes colonnes de différentes tables

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) 
        }; 

Notez que le filtrage, le regroupement et la sortie est la même des deux tables, et je veulent les résultats pour ressembler à ceci:

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

-à-dire les quantités groupées par StockType

Ceci est du code EF premier et il n'y a pas de relation directe entre ces tables, qui i s pourquoi j'essaie cette requête dans la couche de service afin que je puisse accéder aux deux entités.

Répondre

1

Vous devriez être en mesure de « caser » les deux groupes dans la même séquence avec des types anonymes et Concat, puis compter les résultats séparément, comme ceci:

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) 
    }); 
Questions connexes