2010-02-21 51 views
2

產品列表我的產品列表:使用LINQ to更新排名

IQueryable<Product> list = _ProductRepository.GetAll(); 

列Product.Clicks對應於時間的產品已被瀏覽次數。

我想更新的產品清單,並使用排序,如本更新列Product.Rank:

SELECT 
    ProductId, 
    Name, 
    RANK() OVER (ORDER BY Clicks DESC) [Rank], 
    Clicks 
FROM 
    Product 
WHERE 
    Clicks > 0 

什麼是使用LINQ做到這一點的最有效方法是什麼?有沒有辦法直接更新,而不是查詢產品並列舉它們?這將作爲一個批處理作業每週運行。

更新: 看來很多人都認爲SQL SP批處理作業是最好的方法。積分轉到建議這樣的查詢的人。

UPDATE:答案如下:

CREATE PROCEDURE UpdateRank 
AS 
BEGIN 
    SET NOCOUNT ON; 

    WITH RankValues AS 
    (SELECT [ProductId], [Clicks], [Rank], 
    RANK() OVER (ORDER BY [Clicks] DESC) AS [NewRank] 
    FROM [Product]) 
    UPDATE [RankValues] 
    SET [Rank] = [NewRank] 
    WHERE Clicks > 0 
END 
GO 

回答

2

我纔剛剛進入LINQ所以道歉,但爲什麼涉及LINQ?

如果我正在研究這個問題,最有效的方法是將其封裝在一個存儲過程中,並讓它作爲一個自動化作業爲您服務器。

+0

我按照建議實施它。所以這些要點轉到CResults。 – Junto 2010-02-23 08:49:05

0

要回答這個問題,你必須知道你的倉庫是如何實現的(LINQ to sql,實體框架,自定義實現......)。對於Ling to sql,有一個ExecuteQuery method

根據您的存儲庫,您還可以使用存儲過程爲您執行更新。

1

我假設你正在使用linq-to-sql。我會建議使用存儲過程來完成這項工作。創建DataContext時,只需將存儲過程拖到方法窗口即可。

如果你出於某種原因不能使用存儲過程,linq-to-sql有一個ExecuteQuery方法,如果你想做一個'直接更新'並且不想獲取所有記錄並且然後更新它們。

0

同意w /到目前爲止的意見。坦率地說,這看起來像是一個數據庫維護任務,它可以在SQL Server內作爲批處理作業完成。除非需要偶爾從應用程序中明確調用它,否則我甚至不會涉及Linq To SQL。如果那的情況下,那麼你仍然可以按照我所說的做,但也可以像其他人說的那樣做,並將其作爲一種方法添加到您的datacontext中。

+0

任何建議如何更新聲明應該尋找這個? – Junto 2010-02-22 08:13:08

+0

您在select語句中擁有的內容應該在更新查詢的右側正常工作。 – Paul 2010-02-22 16:20:51

0

如果你想使用一個單一的查詢中使用函數RANK()來更新等級場計算排名,我認爲你必須創建這樣一個觀點:

CREATE VIEW [vwProductWithRank] 
AS 
SELECT  ProductID, Rank, Rank() Over (Order by [Clicks]) [CalculatedRank] 
FROM   Product 

它是一個可更新的視圖和你可以在你的SP中像這樣更新它:

UPDATE vwProductWithRank Set [Rank] = [CalculatedRank]