Помощь с LINQ to SQL group by query

#linq-to-sql

#linq-to-sql

Вопрос:

Группа LINQ по синтаксису сбивает меня с толку. В TSQL я могу выбрать несколько столбцов и сгруппировать только по одному из них. С LINQ это заставляет меня группировать по всем столбцам, с которыми я хочу работать.

Как я могу преобразовать этот TSQL в LINQ?

       SELECT         MAX(Item.itemID) AS Expr1, MAX(Item.title) AS Expr2,
 SUM(OrderDetail.quantity) AS Qty, MAX([Order].dateCreated) AS Expr3
        FROM            Payment INNER JOIN
                        [Order] ON Payment.ID = [Order].orderID INNER JOIN
                        OrderDetail ON [Order].orderID = OrderDetail.orderID INNER JOIN
                        Item ON OrderDetail.itemID = Item.itemID
        WHERE           ([Order].dateCreated >= '4 / 15 / 2011 12:00:00 AM') 
                        AND ([Order].dateCreated <= '4/15/2011 11:59:00 PM')
        GROUP BY Item.itemID
        ORDER BY Expr2



 var q = from p in db.Payments
                        join o in db.Orders on p.ID equals o.paymentID
                        join od in db.OrderDetails on o.orderID equals od.orderID
                        join i in db.Items on od.itemID equals i.itemID into j1
                        from j2 in j1
                        where o.dateCreated >= new DateTime(2011, 4, 15)
                        group j2 by j2.itemID into g
                        select new
                        {
                            g.Key 
                        };
  

Ответ №1:

 var query =
    from p in db.Payments
    join o in db.Orders
        on p.ID equals o.orderID
    join od in db.OrderDetails
        on o.orderID equals od.orderID
    join i in db.Items
        on od.itemID equals i.itemID
    where o.OrderDate.Date == new DateTime(2011, 4, 15)
    group new { i.itemID, i.title, od.quantity, o.dateCreated }
        by i.itemID into g
    let Expr1 = g.Max(x => x.itemID)
    let Expr2 = g.Max(x => x.title)
    let Qty = g.Sum(x => x.quantity)
    let Expr3 = g.Max(x => x.dateCreated)
    orderby Expr2
    select new { Expr1, Expr2, Qty, Expr3 };
  

Комментарии:

1. это выглядит неплохо. Можно ли перевести этот же запрос в lambda?

2. @Nick: Да, но это будет чрезвычайно сложно. Было бы лучше оставить это в этой форме. p.s. поставщик запросов, вероятно, не будет генерировать тот же самый точный запрос T-SQL, даже если запрос LINQ по сути является переводом 1: 1, это очень сложный запрос, насколько это касается.