[英]Convert simple SQL group-by into LINQ to SQL
我有麻煩了。 我無法理解 Stack Overflow 上對此的現有答案,而且我對 LINQ 到 SQL 太陌生,無法自己弄清楚。
見此 SQL:
select p.Name as ProductName, SUM(o.NumberOf) as TotalOrdered from [Order] o
join [Product] p on o.ProductId = p.Id
group by p.Name
返回一個漂亮的 2 列表,左側是產品名稱,右側是已訂購的產品總數(所有訂單)。 如何在 LINQ 到 SQL 中復制這個?
這是我到目前為止所得到的:
var ctx = new DataClasses1DataContext();
var totalProducts = (from o in ctx.Orders
join p in ctx.Products on o.ProductId equals p.Id
select new { p.Name, o.NumberOf })
.GroupBy(t => t.Name)
.Select(g => g.Key, ... );
發生了什么...?
它看起來像你想要的:
.Select(g => new { ProductName = g.Key, TotalOrdered = g.Sum(x => x.NumberOf) })
您可以將整個查詢作為單個查詢表達式進行,也可以完全不使用查詢表達式:
var totalProducts = ctx.Orders
.Join(ctx.Products, o => o.ProductId, p => p.Id,
(o, p) => new { p.Name, o.NumberOf })
.GroupBy(t => t.Name,
pair => pair.Name, // Key selector
pair => pair.NumberOf, // Element selector
(key, numbers) => new {
ProductName = key,
TotalOrdered = numbers.Sum())
});
或者:
var totalProdcuts = from o in ctx.Orders
join p in ctx.Products on o.ProductId equals p.Id
group o.NumberOf by p.Name into g
select new { ProductName = g.Key, TotalOrdered = g.Sum() };
TotalOrdered = g.Sum(o => o.NumberOf)
使用上面的 for.... 比語句可能是
select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) };
var query = from o in ctx.Orders
join p in ctx.Products on
o.ProductId equals p.Id
group o by new { p.Name, o.NumberOf } into g
select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) };
只需將其粘貼在這里,以防有助於了解如何通過 GroupJoin 方法實現這一點:
var totalProducts = ctx.Products.GroupJoin(ctx.Orders,
outerKeySelProduct => outerKeySelProduct.Id,
innerKeySelOrder => innerKeySelOrder.ProductId,
(outerKeySelProduct, innerKeySelOrder) => new
{
ProductName = outerKeySelProduct.Name,
TotalOrdered = innerKeySelOrder.Select(n => n.NumberOf).Sum()
});
如果可以改進,很高興對其進行編輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.