#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, это очень сложный запрос, насколько это касается.