Преобразование простого SQL-группирования в LINQ to SQL - PullRequest
14 голосов
/ 07 июля 2011

У меня проблемы. Я не могу понять существующие ответы на этот вопрос по переполнению стека, и я слишком новичок в LINQ to 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 to 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, ... );

Что идет на ...?

Ответы [ 3 ]

34 голосов
/ 07 июля 2011

Мне кажется, что вы хотите:

.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() };
4 голосов
/ 07 июля 2011
TotalOrdered = g.Sum(o => o.NumberOf)

используйте выше для .... чем утверждение может быть

   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) };
0 голосов
/ 11 июля 2011

Просто вставьте это здесь на случай, если будет полезно узнать, как этого можно достичь с помощью метода 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()
    });

Рад, что его можно отредактировать, если его можно улучшить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...