none
Join Linq Dinamico RRS feed

  • Pergunta

  • Olá,

    estou tentando fazer join usando Linq Dinamico e não estou conseguindo.
    O código que está com problema é este:

                var dados = from a in db.Usuario
                        join b in db.Pessoa on a.PessoaID equals b.PessoaID
                        join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                        join d in db.Sexo on b.SexoID equals d.SexoID 
                        .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                        .OrderBy(sidx + " " + sord)
                        .Skip(pageIndex * pageSize)
                        .Take(pageSize)
                        select new {
                            ID = a.UsuarioID,
                            Login = a.Login
                        };

    Tenho outros Linq Dinamicos que funcionam conforme abaixo e não entendo o motivo dos acima não funcionar.

    Este funciona:

                var EspecialidadeMedicaLista = (from lista in db.EspecialidadeMedica
                                .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                                .OrderBy(sidx + " " + sord)
                                .Skip(pageIndex * pageSize)
                                .Take(pageSize)
                                select lista);
    Os erros que o VS mostra são:

    Error	1	'int' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Dynamic.DynamicQueryable.Where(System.Linq.IQueryable, string, params object[])' has some invalid arguments	M:\C#\ERP\ERP\Controllers\UsuarioController.cs	301	21	ERP
    Error	2	Instance argument: cannot convert from 'int' to 'System.Linq.IQueryable'	M:\C#\ERP\ERP\Controllers\UsuarioController.cs	301	21	ERP
    
    Abs

    Marlon Tiedt
    www.sesmt.com.br


    • Editado Marlon Tiedt terça-feira, 25 de setembro de 2012 01:51
    terça-feira, 25 de setembro de 2012 01:50

Todas as Respostas

  • Olá Marlon,

    Veja se com os parâmetros resolve isso:

       var dados = (from a in db.Usuario
                        join b in db.Pessoa on a.PessoaID equals b.PessoaID
                        join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                        join d in db.Sexo on b.SexoID equals d.SexoID)
                        .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                        .OrderBy(sidx + " " + sord)
                        .Skip(pageIndex * pageSize)
                        .Take(pageSize);

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 25 de setembro de 2012 02:10
    Moderador
  • Olá Fernando, 

    desta forma eu tinha tentado, o Linq SQL sempre espera o final um group by ou um select.
    Quando tento colocar o SELECT não funciona..

    Abs

    Marlon Tiedt
    www.sesmt.com.br

    terça-feira, 25 de setembro de 2012 11:26
  • Olá Marlon,

    E com a sintaxe abaixo, será que resolve?

     var dados = (((from a in db.Usuario
                        join b in db.Pessoa on a.PessoaID equals b.PessoaID
                        join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                        join d in db.Sexo on b.SexoID equals d.SexoID)
                        .Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"")
                        .OrderBy(sidx + " " + sord))
                        .Skip(pageIndex * pageSize)
                        .Take(pageSize))
                        .Select(a => new { ID = a.UsuarioID, Login = a.Login});
    .

    []s!

    Fernando Henrique Inocêncio Borba Ferreira
    Microsoft MVP - Data Platform Development
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.com/
    Twitter: @ferhenrique
    Entity Framework - Brasil: https://www.facebook.com/EntityFrameworkBrasil

    terça-feira, 25 de setembro de 2012 12:03
    Moderador
  • Olá Fernando,

    vou tentar o que você passou. Uma coisa que eu testei aqui e funcionou foi assim, conforme abaixo. Achei essa sintaxe até que bonita, pois cada item ficaria separado.

                var dados = from a in db.Usuario
                            join b in db.Pessoa on a.PessoaID equals b.PessoaID
                            join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                            join d in db.Sexo on b.SexoID equals d.SexoID
                            select new
                            {
                                ID = a.UsuarioID,
                                Login = a.Login,
                                Fixo = a.Fixo,
                                Nome = b.Nome,
                                EmpresaID = a.EmpresaID,
                                Apagado = a.Apagado
                            };
                dados = dados.Where("(EmpresaID == " + _EmpresaID + " || EmpresaID == 0) && Apagado == \"N\"");
                dados = dados.OrderBy(sidx + " " + sord);
                dados = dados.Skip(pageIndex * pageSize);
                dados = dados.Take(pageSize);

    Vou testar sua forma e digo se funcionou depois...
    A forma que você passou não rolou também...Acho que vou deixar como eu fiz...Até ficou bonita... :)

    Abs


    Marlon Tiedt
    www.sesmt.com.br



    • Editado Marlon Tiedt terça-feira, 25 de setembro de 2012 12:26
    terça-feira, 25 de setembro de 2012 12:16
  • Pelo q eu endenti _EmpresaID é um integer.... vc não poderia concatenar ele com uma string dessa forma....

    var dados = from a in db.Usuario
                join b in db.Pessoa on a.PessoaID equals b.PessoaID
                join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                join d in db.Sexo on b.SexoID equals d.SexoID 
                .Where(String.Format("(EmpresaID == {0} || EmpresaID == 0) && Apagado == \"N\"", _EmpresaID)
                .OrderBy(sidx + " " + sord)
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                 select new {
                       ID = a.UsuarioID,
                       Login = a.Login
                 };

    Mas porque voce esta usando uma Query Dinamica se ela não é ? Voce não poderia simplesmente fazer:

    var query = from a in db.Usuario
                join b in db.Pessoa on a.PessoaID equals b.PessoaID
                join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                join d in db.Sexo on b.SexoID equals d.SexoID 
    	    where 
    		(a.EmpresaID = _EmpresaID || a.EmpresaID == 0) &&
                    (a.Apagado == "N") 
    	     select new {
                       ID = a.UsuarioID,
                       Login = a.Login
                 };
    var dados = query.OrderBy(sidx + " " + sord)
                   .Skip(pageIndex * pageSize)
                   .Take(pageSize);


    Microsoft Community Contributor

    terça-feira, 25 de setembro de 2012 13:09
    Moderador
  • Olá Rui,

    a questão de ser dinamica, é pelo fato do OrderBy.

    query.OrderBy(sidx + " " + sord)


    Pois usando somente Linq eu não posso fazer da forma acima. Somente com Linq.Dynamic
    O erro que acontece é:

    Error	3	'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' has some invalid arguments	J:\C#\ERP\ERP\Controllers\UsuarioController.cs	294	21	ERP
    Error	4	Argument 2: cannot convert from 'string' to 'System.Func<AnonymousType#1,int,bool>'	J:\C#\ERP\ERP\Controllers\UsuarioController.cs	294	33	ERP
    Error	5	The type arguments for method 'System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.	J:\C#\ERP\ERP\Controllers\UsuarioController.cs	295	21	ERP
    

    Abs...


    Marlon Tiedt
    www.sesmt.com.br

    terça-feira, 25 de setembro de 2012 13:19
  • Falha minha, faltou um parenteses "_EmpresaID))"

    var dados = from a in db.Usuario
                join b in db.Pessoa on a.PessoaID equals b.PessoaID
                join c in db.TipoPessoa on b.TipoPessoaID equals c.TipoPessoaID
                join d in db.Sexo on b.SexoID equals d.SexoID 
                .Where(String.Format("(EmpresaID == {0} || EmpresaID == 0) && Apagado == \"N\"", _EmpresaID))
                .OrderBy(sidx + " " + sord)
                .Skip(pageIndex * pageSize)
                .Take(pageSize)
                 select new {
                       ID = a.UsuarioID,
                       Login = a.Login
                 };

    E eu entendi... por isso que no segundo exemplo eu dividi a query em 2 variaveis.... como voce pretende fazer um order by dinamico, não precisa do where tambem dinamico...


    Microsoft Community Contributor

    terça-feira, 25 de setembro de 2012 14:27
    Moderador
  • Olá Rui,

    posso estar errado, porém, eu acho que o Linq não aceita isto:

    OrderBy(sidx + " " + sord)

    Isto é somente possivel se eu der using em:

    using System.Linq.Dynamic;

    Sem isto comando espera a => "algo"

    Abs


    Marlon Tiedt
    www.sesmt.com.br

    terça-feira, 25 de setembro de 2012 14:42