3
respostas

SELECT * FROM TABLE1 LIMIT 10,50?

var query = from g in generos
select g;
query=query.skip(10);
query=query.Take(50);

Como devo modificar o código acima para que haja apenas um busca no banco?

3 respostas

Olá Eduardo,

fiz uns testes e consultei os logs de consultas de um projeto .net core, usado query muito parecida com a que você mandou. Aparentemente ele já está fazendo apenas uma única consulta. Como você passou para a própria variável query o Skip e o Take, o Entity consegue fazer uma leitura completa e adicionar na consulta do banco um limit e um offset justamente referentes ao skip e o take.

Olá, Eduardo

A consulta que postou aqui no fórum ainda não faz nenhuma busca no banco. Por quê? Porque você ainda não pediu os dados da consulta.

No LINQ, existem os conceitos de execução adiada e execução imediata. O que você está fazendo acima não é executar uma consulta, mas sim criar uma definição de consulta.

Quando é que uma consulta LINQ vai ser executada de fato no banco de dados (ou numa lista de objetos, arquivo XML, etc)? Somente quando você precisar realmente acessar os elementos da enumeração gerada pela consulta. Por exemplo, a consulta acima pode ter sua execução adiada até um laço foreach usado para iterar sobre os gêneros:

foreach(var genero in query) // <-- a consulta só é executada neste ponto!
{
    Console.WriteLine(genero.Nome); 
}

Por outro lado, você pode forçar uma consulta imediata usando comandos LINQ como Count(), First(), Last(), ToList(), etc:

int quantidadeDeGeneros = query.Count();

Aqui sim vemos um comando Count, que executa imediatamente a consulta.

Lucas e Marcelo, muito obrigado! A dúvida foi respondida completamente.. Abraço...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software