2010-05-01 146 views
0

我正在將我的項目轉換爲使用EF並且還希望將存儲過程轉換爲Linq-to-entities查詢。SQL的Rownumber與Linq-to-entities

這是我的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 

在的話:我要回另外該產品的所有類別(從分類表)和標題和日期(來自產品表),最後添加到此類別中。

如何使用實體框架工作查詢來實現此目的?
以最有效的方式。

+1

你想EF中的解決方案,還是你想要最有效的方法?最有效的方法是用SQL編寫它。如果不是使用CROSS APPLY的窗口函數,則可以比當前的方法更快。 – 2010-05-01 18:30:51

+0

@Mark Byers,所以你建議把它作爲存儲過程嗎? 你可以請示出如何在這裏使用交叉應用? – mariki 2010-05-01 18:37:07

+0

嗯,這取決於。你說你想在EF英孚提供解決方案,但你也表示你想要最有效的方法。如果您可以使用可行的解決方案,但可能不是最佳性能,那麼EF解決方案將會很好,並且更易於維護。 CROSS APPLY方法非常複雜 - 你可以在這裏閱讀:http://explainextended.com/2009/11/30/sql-server-selecting-records-holding-group-wise-maximum/。什麼是最好的也取決於你有多少行。如果你只有幾行,那麼表掃描可能是最快的方法。 – 2010-05-01 18:39:25

回答

-1

在這種情況下需要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] 
+0

我還沒有測試此查詢,但我不喜歡這個團隊,我有大約10個需要返回的列,所以這需要我將所有這些列進行分組,對吧? – mariki 2010-05-01 19:10:07

+0

檢查此查詢後沒有返回所需內容 – mariki 2010-05-01 20:09:39

+0

在上面添加了新的查詢。 – 2010-05-01 23:39:56