Использование LINQ для обновления списка продуктов с рангом - PullRequest
2 голосов
/ 21 февраля 2010

У меня есть список продуктов:

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

ОБНОВЛЕНИЕ: Ответьте следующим образом:

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

Ответы [ 5 ]

2 голосов
/ 21 февраля 2010

Я только вхожу в LINQ, поэтому извиняюсь, но зачем привлекать LINQ?

Если бы я смотрел на эту проблему, то наиболее эффективным способом было бы обернуть ее в сохраненный процесс и оставить ее для сервера, чтобы она выполнялась для вас как автоматизированная работа.

1 голос
/ 21 февраля 2010

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

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

0 голосов
/ 22 февраля 2010

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

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

Это обновляемый вид, и вы можете обновить его в своем SP:

UPDATE vwProductWithRank Set [Rank] = [CalculatedRank]
0 голосов
/ 21 февраля 2010

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

0 голосов
/ 21 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...