Linq - как написать группу по запросу, чтобы получить количество каждого продукта - PullRequest
0 голосов
/ 28 мая 2020

Привет всем, у меня есть следующие данные

Item    Qty Type
1       2   Purchase
1       3   Sales
1       8   Return

2       5   Purchase
2       4   Sales
2       5   Return

Теперь у меня есть требование получить количество каждого элемента путем вычитания продаж и возврата с покупкой, и мой окончательный результат будет

item    Qty
1      -9
2      -4

Примечание. Чтобы получить количество: Qty => (Purchase Qty - SalesQty - Return Qty) например: (2-3-8)

Итак, как я могу написать этот запрос в LINQ или в SQL

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Если вы используете LINQ to SQL, вы можете:

var ans = from i in src
          group i by i.Item into ig
          let PurchaseQty = ig.Where(i => i.Type == "Purchase").Sum(i => i.Qty)
          let SalesQty = ig.Where(i => i.Type == "Sales").Sum(i => i.Qty)
          let ReturnQty = ig.Where(i => i.Type == "Return").Sum(i => i.Qty)
          select new {
              Item = ig.Key,
              Qty = PurchaseQty - SalesQty - ReturnQty
          };

Если вы используете LINQ to EF 2.2, он может работать, но будет выполнять группировку на стороне клиента. Если вы используете EF 3.x, удачи!

0 голосов
/ 28 мая 2020

SQL Запрос:

SELECT Item, SUM(CASE Type WHEN 'Purchase' THEN Qty ELSE -Qty END) AS Qty
FROM Table
GROUP BY Item

LINQ:

Items
.GroupBy(p => p.Item)
.Select(p => new
{
     Item = p.Key,
     Qty = p.Sum(x => x.Type == "Purchase" ? x.Qty : -x.Qty)
});
...