Comportamento de processamento posterior do Linq
-
09-09-2020 - |
Pergunta
Nesta situação:
var allCustomers = from c in customers select c;
var oldCustomers = from o in allCustomers where o.age > 70 select o;
Vai onde cláusula atinge banco de dados?
Solução
Eu acho que você quer dizer:
var oldCustomers = from o in allCustomers where o.age > 70 select o;
E sim, chegará ao banco de dados.
Tente usar o LINQPad para ver o código SQL gerado.Aqui está um exemplo:
eu tenho um Actor
tabela que contém os campos:
Id | Name | Age
O código:
var x = from c in Actors where c.Name.Contains("a") select c;
var y = from c in x where c.Age > 0 select c;
é traduzido para:
-- Region Parameters
DECLARE @p0 Int = 0
DECLARE @p1 NVarChar(3) = '%a%'
-- EndRegion
SELECT [t0].[Id], [t0].[Name], [t0].[Age]
FROM [Actor] AS [t0]
WHERE ([t0].[Age] > @p0) AND ([t0].[Name] LIKE @p1)
então você pode ver como ele mistura as duas consultas em apenas uma.
Lembre-se, IEnumerables são preguiçosos, então você, a menos que seus elementos precisem ser conhecidos (porque você itera através deles, ou porque você não .Count()
para ver quantos itens são, etc.), ele não realizará nenhuma consulta/operação.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow