Rownumber SQL с Linq-to-entity - PullRequest
       13

Rownumber SQL с Linq-to-entity

0 голосов
/ 01 мая 2010

Я конвертирую свой проект для использования EF, а также хочу преобразовать хранимые процедуры в запросы Linq-to-entity.

Это мой SQL-запрос (простая версия), который мне трудно преобразовать:

SELECT 
       CategoryID, Title as CategoryTitle,Description, 
       LastProductTitle,LastProductAddedDate
FROM
(
    SELECT
        C.CategoryID, C.Title,C.Description, C.Section,
        P.Title as LastProductTitle, P.AddedDate as LastProductAddedDate,                                          
        ROW_NUMBER() OVER (PARTITION BY P.CategoryID ORDER BY P.AddedDate DESC) AS Num

    FROM 
         Categories C         
         LEFT JOIN Products P ON P.CategoryID = C.CategoryID
) OuterSelect

WHERE 
     OuterSelect.Num = 1

Словами: я хочу вернуть все Категории (из таблицы "Категории"), а также название и дату добавления продукта (из таблицы "Продукты"), который был добавлен последним в эту категорию.

Как мне добиться этого, используя рабочий запрос фрейма Entity?
Наиболее эффективным способом.

1 Ответ

0 голосов
/ 01 мая 2010

Нужен ли Row_Number () в этом случае?

Далее возвращается самый последний заказ для всех клиентов в базе данных Northwind:

from c in Customers
join o in Orders on c.CustomerID equals o.CustomerID
group o by  new { c.CustomerID, c.ContactName}  into g
select new {
 CustomerID = g.Key.CustomerID,
 Name = g.Key.ContactName,
 OrderDate = g.Max(a=> a.OrderDate)
}

Создан запрос (из LinqPad)

SELECT MAX([t1].[OrderDate]) AS [OrderDate], [t0].[CustomerID], [t0].[ContactName] AS [Name]
FROM [Customers] AS [t0]
INNER JOIN [Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
GROUP BY [t0].[CustomerID], [t0].[ContactName]

Вместо этого он выполняет левое соединение

from c in Customers
         join o in Orders on c.CustomerID equals o.CustomerID into g
         from a in g.DefaultIfEmpty()
         group a by new { c.CustomerID, c.ContactName}  into g
         select new
         {
             g.Key.CustomerID,
             g.Key.ContactName,
             RecentOrder  = g.Max(a=> a.OrderDate) 
         }

и сгенерированный запрос

SELECT MAX([t1].[OrderDate]) AS [RecentOrder], [t0].[CustomerID], [t0].[ContactName]
FROM [Customers] AS [t0]
LEFT OUTER JOIN [Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
GROUP BY [t0].[CustomerID], [t0].[ContactName]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...