Inquiridor
LINQ vs Queryable Methods

Discussão Geral
-
Galera, tenho usado bastante LINQ ultimamente, e me deparei com uma dúvida.
Quando é melhor usar LINQ:
e.g:
/* SAMPLE ONLY */ var result = (from p in dataContext.PRODUTOS group p by p.CATEGORY into g select g);
E quando é melhor usar os métodas da classe Queryable:e.g:
var result= dataContext.PRODUTOS.GroupBy(p => p.CATEGORY));
PS: Não limitem suas opniões aos exemplos dados a cima, por favor.
- Movido Olavo Oliveira NetoModerator quinta-feira, 3 de novembro de 2011 12:32 Amigo, estou movendo sua thread para um fórum especifico de Linq (De:.NET Development - Geral)
- Tipo Alterado Olavo Oliveira NetoModerator quinta-feira, 3 de novembro de 2011 12:39
- Editado E. Pacheco quinta-feira, 3 de novembro de 2011 12:43
- Tipo Alterado E. Pacheco quinta-feira, 3 de novembro de 2011 12:44 Não é uma pergunta. Sei que o resultado é o mesmo. Quero apenas saber qual cada um usaria e porque. Não a uma resposta, apenas opniões.
Todas as Respostas
-
você está querendo perguntar se é melhor usar a sintaxe LINQ de consultas ou fazer a consulta em Lambda Expressions ? é a mesma coisa. os dois serão interpretados da mesma maneira e irão dar o mesmo resultado.
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Twitter @Olavooneto
Se for útil marque como resposta e faça um Developer feliz :) -
-
Pacheco como o Olavo disse acima tanto o Linq queries e o Exstesion method atraves de expressões lambdas chegam ao mesmo resultado, eu particulamente prefiro o extension method, mais como eu sei que nem todos que programa com .net conhece LINQ bem, eu uso linq queries pensando na facilidade de manutenção, pois é mais facil de compreende doque uma expressão lambda
Vitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
Mas em casos como esse:
var result = (from p in dataContext.PRODUTOS where p.COUNT > 0 group p by p.CATEGORY into g select g); /* OR */ var result = dataContext.PRODUTOS.Where(p => p.COUNT > 0).GroupBy(p.CATEGORY);
A impressão que eu tenho, é qe no primeiro caso ele transforma tudo em um "comando" só e pega o resultado. Enquanto no segundo, ele pega o resultado de um, pra depois pegar o resultado do outro.Isso é correto? Ou é correto em uns casos e outros nao? Que pensa sobre?
-
Olá Pacheco,
Vamos lá.
De acordo com Joseph Albabari e Ben Albabari, autores dos livros "LINQ - Pocket Reference" e "LINQ" (ambos da editora O'Reilly), existe uma diferença entre as duas sintaxes. A sintaxe LINQ, quando interpretada pelo compilador é transformada (isso mesmo... ) em sintaxe Lambda. E o CLI interpreta a Lambda. Então, no infringir dos ovos, o compilador irá transformar a sintaxe LINQ em Lambda.
Isso irá causar algum ganho ou perda de performance? Não, pq o trabalho de transformação é feito apenas uma vez, que é quando o compilador transforma tudo em assembly.
O que eu prefiro? Eu prefiro a Lambda, pois é mais direta.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique
- Editado Fernando Henrique Inocêncio Borba FerreiraMicrosoft employee, Moderator sexta-feira, 4 de novembro de 2011 00:57
-
Significa então, que no final das contas dá tudo na mesma?
Digo, se uma consulta usando lambda expression "gasta" 3 métodos, então uma consulta LINQ, para retornar o msmo resultado, também será transformada nesses 3 métodos?
Tive que fazer o teste, olha ai no que deu:
static void Main(string[] args) { using (var cntxt = new DataClasses1DataContext()) { Console.WriteLine("--------------- LAMBDA EXPRESSION ---------------\n"); var begin1 = DateTime.Now; var result1 = cntxt.Products.Where(p => p.UnitsInStock > 0).Select(p => new { p.ProductID, p.ProductName }).ToArray(); var end1 = DateTime.Now; var delta1 = end1 - begin1; Console.WriteLine("Delta of result1 (Lambda Expression): " + delta1.ToString()); Console.WriteLine("The count of Items in the result1 is:" + result1.Length.ToString()); Console.ReadKey(); Console.WriteLine("\n--------------- LINQ ---------------\n"); var begin2 = DateTime.Now; var result2 = (from p in cntxt.Products where p.UnitsInStock > 0 select new { p.ProductID, p.ProductName }).ToArray(); var end2 = DateTime.Now; var delta2 = end2 - begin2; Console.WriteLine("Delta of result2 (LINQ): " + delta2.ToString()); Console.WriteLine("The count of Items in the result2 is:" + result2.Length.ToString()); Console.ReadKey(); Console.WriteLine("\nIs result1 identical to result2?"); if (result1.Length != result2.Length) Console.WriteLine(false); else { bool isEqual = true; for (int i = 0; i < result1.Length; i++) isEqual &= (int.Equals(result1[i].ProductID, result2[i].ProductID)) && (string.Equals(result1[i].ProductName, result2[i].ProductName)); Console.WriteLine(isEqual); } Console.ReadKey(); Console.WriteLine("\nWho Is Faster?"); if (delta1 > delta2) Console.WriteLine("LINQ"); else Console.WriteLine("Lambda Expression"); Console.ReadKey(); } }
No teste proposto, LINQ se sai consideravelmente melhor. BEM mais rápido.A dúvida qe fica é: esse teste é válido?
Pra você me responder essa pergunta, acredito que só falta saber qual é o banco de dados, e talvez testar vc mesmo.
A classe DataClasses1DataContext é bem simples, entre aspas. Apenas cliquei em adicionar novo item, selecionei LINQ to SQL, e adicionei todas as tabelas do Northwind.
- Editado E. Pacheco sexta-feira, 4 de novembro de 2011 13:10
-
Olá Pacheco,
Isso é difícil saber por diversos motivos, sendo:
1 - As vezes por vc ter executado em primeiro lugar a sintaxe Lambda o banco de dados pode optimizado sua consulta e na hora de consultar com o LINQ o resultado foi melhor.
2 - O seu DataContext no primeiro acesso usando Lambda estava colocando os objetos no cache interno do ADO.Net, e por isso a segunda consulta foi mais rápida.
A verdade é que todos esses comandos irão tornar-se comandos Transaction SQL, e assim da na mesma, pois quem irá interpretar os comandos será o banco de dados.
Não acredito realmente que a sintaxe possa mudar a eficiência das consultas, pois é tudo a mesma coisa =]
É como se alguém falasse: VB.Net é mais rápido que C#.
Todo o código se tornará CLR. Assim como toda consulta se tornará Transaction SQL.
Acredito que se vc mudar a estrutura do seu teste, colocando as duas em situações semelhantes, e fazendo um teste de stress, vc verá que é tudo a mesma coisa.
[]s!
Fernando Henrique Inocêncio Borba Ferreira
while(alive){ this.WriteCode(); }
Blog: http://ferhenriquef.wordpress.com/
Twitter: @ferhenrique