2010-02-21 2 views
2

У меня есть список продуктов:Использование LINQ для обновления списка продуктов с рангом

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, чтобы сделать это? Есть ли способ сделать прямое обновление, а не запрашивать продукты и перечислять их? Это будет выполняться как пакетное задание на еженедельной основе.

UPDATE: Похоже, что многие люди предположили, что пакетное задание 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

0

Чтобы ответить на этот вопрос, нужно было бы знать, как реализован ваш репозиторий (linq to sql, структура сущности, пользовательская реализация, ...). Для Ling to sql есть ExecuteQuery method.

В зависимости от вашего репозитория вы также можете использовать хранимую процедуру для обновления.

1

Я предполагаю, что вы используете linq-to-sql. Я бы рекомендовал использовать хранимую процедуру для выполнения этой задачи. Создавая свой DataContext, просто перетащите свою хранимую процедуру в окно методов.

Если вы по какой-то причине не можете использовать хранимую процедуру, у linq-to-sql есть метод ExecuteQuery, который вы можете использовать, если хотите сделать «прямое обновление» и не хотите получать все записи и затем обновите их.

0

Согласовано с комментариями до настоящего времени. По-видимому, задача обслуживания базы данных, честно говоря, может и shoudl быть выполнена как пакетное задание внутри SQL Server. Я бы даже не включил Linq To SQL, если вам не нужно явно называть его изнутри. Если это - это, то вы все равно можете сделать то, что я сказал, но затем сделайте так же, как сказали другие, и добавьте его как метод в свой файл данных.

+0

Любые предложения по тому, как инструкция обновления должна искать это? – Junto

+0

То, что у вас было в вашем предложении select, должно работать нормально в правой части запроса на обновление. – Paul

0

Если вы хотите использовать один запрос для обновления поля Ранга с Рассчитано Rank, используя функцию Rank(), я думаю, вы должны создать представление, как это:

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

Это обновляемый вид и вы может обновить его вот так в вашем пакете SP:

UPDATE vwProductWithRank Set [Rank] = [CalculatedRank] 
Смежные вопросы