C#: usando Skip e Take com Entity Framework Core e SQL Server 2005 ou 2008

Requisitos

  • .NET Core Runtime 2.2.8 e SDK 2.2.207
  • SQL Server 2008 Express

Simulando o problema

  • Abra o Visual Studio Code,
  • Crie e abra a pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008,
  • Execute os comandos a seguir:

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo appsettings.json,

  • Edite o arquivo de projeto CSharpEFSkipTakeSql2005e2008.Prompt.csproj, incluindo a referência ao arquivo appsettings.json,

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo Person.cs,

  • Na pasta C:\GitHub\tiagopariz\CSharpEFSkipTakeSql2005e2008\src\CSharpEFSkipTakeSql2005e2008.Prompt adicione o arquivo SkipTakeContext.cs,

  • Abra o terminal e digite os comandos a seguir para criar o banco,

  • Inclua umas 20 linhas de dados,

  • Altere a classe Program.cs, ordenando por nome listando os primeiros 10 registros (Take(10)) e pulando os dois primeiros (Skip(2)),

  • Execute o projeto com o comando a seguir,

  • A seguinte mensagem de erro será exibida:

  • O erro ocorre quando o Entity Framework Core tenta executar a seguinte consulta:

A clausula OFFSET é um recurso do SQL Server 2012 e que é a forma padrão do .NET Core criar consultas usando Take e Skip.

No SQL Server 2008 temos a função Row_Number() que atende o Take e Skip. Então, para que o EF Core use esta função, precisamos fazer um ajuste mínimo na classe de contexto.

Ajustando o DbContext

  • Edite o arquivo SkipTakeContext.cs, e no método OnConfiguring() edite a linha optionsBuilder.UseSqlServer(_connectionString) para que o Entity Framework Core use a função Row_Number() no lugar da claúsula OFFSET,

  • Execute novamente a aplicação:

  • Agora os resultados serão exibidos corretamente,

.NET Core 3.0 ou superior

Não há suporte para SQL Server 2005 e 2008 a partir do .NET Core 3.0.

Repositório no GitHub

https://github.com/tiagopariz/CSharpEFSkipTakeSql2005e2008