none
LINQ não cria select que traga pelo índice da tabela RRS feed

  • Pergunta

  • Pessoal, estou tentando realizar uma consulta com LINQ to SQL para trazer a tabela na ordem em que ela está no banco.
    Para isso, defini um index pelo campo ID_VIDEO, como descendente. Assim, o select "select * from videos" vai sempre me trazer os vídeos na ordem dos mais recentes, pois ID_VIDEO é um auto identity.

    Então, com "select * from VIDEOS" eu receberia do banco ordenado descendentemente pelo ID_VIDEO
    ID_VIDEO   outros campos
    9
    8
    7
    6
    5
    4
    3
    2
    1

    Ocorre que, quando eu uso TAKE e SKIP, o LINQ gera o seguinte SQL

    SELECT [t2].[Id_Video], [t2].[Description], [t2].[Duration], [t2].[Keywords], [t2].[Category], [t2].[Thumb], [t2].[Views], [t2].[TotalRating], [t2].[Votes], [t2].[DateAdd]
    FROM (
        SELECT [t1].[Id_Video], [t1].[Description], [t1].[Duration], [t1].[Keywords], [t1].[Category], [t1].[Thumb], [t1].[Views], [t1].[TotalRating], [t1].[Votes], [t1].[DateAdd], [t1].[ROW_NUMBER]
        FROM (
            SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Id_Video]  , [t0].[Description], [t0].[Duration], [t0].[Keywords], [t0].[Category], [t0].[Thumb], [t0].[Views], [t0].[TotalRating], [t0].[Votes], [t0].[DateAdd]) AS [ROW_NUMBER], [t0].[Id_Video], [t0].[Description], [t0].[Duration], [t0].[Keywords], [t0].[Category], [t0].[Thumb], [t0].[Views], [t0].[TotalRating], [t0].[Votes], [t0].[DateAdd]
            FROM [dbo].[Videos] AS [t0]
            ) AS [t1]
        WHERE [t1].[ROW_NUMBER] BETWEEN 0 + 1 AND 0 + 40
        ) AS [t2]
    ORDER BY [t2].[ROW_NUMBER]

    Pelo SQL acima, dá para perceber que LINQ TO SQL abandonou o índice do campo ID_VIDEO (descendente e clusterizado) e está agora trazendo na ordem crescente, pois está faltando o DESC alí no order (sublinhado).
    Se eu tentar usar o .OrderByDescending(), eu acabo tendo que ordenar a tabela inteira para somente então usar o Skip e o Take, destruindo a performance.

    Como eu posso obter um select que traga a tabela na ordem em que um select comum me traria?

    segunda-feira, 13 de agosto de 2012 15:17

Todas as Respostas

  • Você poderia incluir um campo com data e horário que o item foi incluso, ai é só usar um orderby. Você também pode usar um OrderbyDescending no id, mais o problema que vc não vai ter garantia que sãos os registros mais recentes que estarão em primeiro.


    quinta-feira, 16 de agosto de 2012 21:10