2010-02-21 49 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]