none
LINQ vs Queryable Methods RRS feed

  • 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.
    quinta-feira, 3 de novembro de 2011 12:14

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 :)
    quinta-feira, 3 de novembro de 2011 12:39
    Moderador
  • Sim, estou ciente. A discussão é: qual você prefere, porque?
    quinta-feira, 3 de novembro de 2011 12:42
  • 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/
    quinta-feira, 3 de novembro de 2011 13:42
  • 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?

    quinta-feira, 3 de novembro de 2011 13:58
  • 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

    sexta-feira, 4 de novembro de 2011 00:57
    Moderador
  • 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
    sexta-feira, 4 de novembro de 2011 13:05
  • 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
    sexta-feira, 4 de novembro de 2011 20:07
    Moderador