none
Retorno de DataTables com LINQ RRS feed

  • Pergunta

  • Como posso retornar mais de uma DataTable com LINQ ?

    public List<DataTable> RetornaCargaInicial(int pIdUsuario)
    		{
    		  DataTable dtEmpresa = new DataTable();
    
    		  dtEmpresa.Columns.Add("IdEmpresa", typeof(int));
    		  dtEmpresa.Columns.Add("CNPJ", typeof(string));
    		  dtEmpresa.Columns.Add("InscricaoEstadual", typeof(string));
    		  dtEmpresa.Columns.Add("NomeFantasia", typeof(string));
    		  dtEmpresa.Columns.Add("RazaoSocial", typeof(string));
    
    DataTable dtContrato = new DataTable();
    
    			dtContrato.Columns.Add("IdContrato", typeof(int));
    			dtContrato.Columns.Add("IdEmpresa", typeof(int));
    			dtContrato.Columns.Add("NomeContrato", typeof(string));
    			dtContrato.Columns.Add("Contato", typeof(string));
    
    DataTable dtUsuario = new DataTable();
    
    			dtUsuario.Columns.Add("IdUsuario", typeof(int));
    			dtUsuario.Columns.Add("IdEmpresa", typeof(int));
    			dtUsuario.Columns.Add("IdPerfil", typeof(int));
    			dtUsuario.Columns.Add("IdTipoUsuario", typeof(Byte));
    
    			var QueryEmpresa =
    				 from a in linkitDataContext.Empresas
    				 join b in linkitDataContext.Usuarios on a.IdEmpresa equals b.IdEmpresa
    				 where b.IdUsuario == pIdUsuario
    				 select b;
    
    			var contratos =
    				from c in linkitDataContext.Contratos
    				join d in linkitDataContext.Usuarios on c.IdEmpresa equals d.IdEmpresa
    				where d.IdUsuario == pIdUsuario
    				select d;
    
    			var usuarios =
    				from e in linkitDataContext.Usuarios
    				where e.IdUsuario == pIdUsuario
    				select e;
    

    segunda-feira, 14 de fevereiro de 2011 18:14

Respostas

  • Heron,

    O seu problema é que vc não esta fazendo nada com o seus datatables...

    Primeiramente, leve em consideração que DataSet e DataTable é uma solução obsoleta que era usada antes do surgimento do linq... a ideia é ir parando de usar os mesmos na medida do possivel...

    vc pode retornar 3 IEnumerables no lugar... para isso seria mais pratico criar uma classe de retorno..

    public class RespostaCargaInicial {
          public IEnumarable<Empresa> Empresas { get; set; }
          public IEnumarable<Contrato> Contratos { get; set; }
          public IEnumarable<Usuario> Usuarios{ get; set; }
        }
    
        public RespostaCargaInicial RetornaCargaInicial(int pIdUsuario) {
          RespostaCargaInicial retorno = new RespostaCargaInicial();
          retorno.Empresas = (from a in linkitDataContext.Empresas
                    join b in linkitDataContext.Usuarios on a.IdEmpresa equals b.IdEmpresa
                    where b.IdUsuario == pIdUsuario
                    select b).AsEnumarable();
    
          retorno.Contratos = (from c in linkitDataContext.Contratos
                     join d in linkitDataContext.Usuarios on c.IdEmpresa equals d.IdEmpresa
                     where d.IdUsuario == pIdUsuario
                     select d).AsEnumarable();
    
          retorno.Usuarios = (from e in linkitDataContext.Usuarios
                    where e.IdUsuario == pIdUsuario
                    select e).AsEnumerable();
    
          return retorno;
        }
    

    Agora se vc esta retornando DataTables, devido algum motivo de compatibilidade com um sistema antigo...  de uma olhada nestes links...

    http://msdn.microsoft.com/en-us/library/bb386921.aspx
    http://unboxedsolutions.com/sean/archive/2009/06/06/15961.aspx

    • Marcado como Resposta Heron Dantas terça-feira, 15 de fevereiro de 2011 14:58
    terça-feira, 15 de fevereiro de 2011 12:29
    Moderador

Todas as Respostas

  • Heron,

    Você pode ao invés de retornar um DataTable, retornar um DataSet com essas DataTables... Ou você pode utilizar Tuples:

    http://carloscds.net/2011/02/usando-tuples-em-cretornando-vrios-parmetros-de-um-mtodo/


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 14 de fevereiro de 2011 22:22
    Moderador
  • André, eu atribui em um DataSet minhas DataTables, porém elas não estão passando por meus códigos LINQ, como posso corrigir isso?

    			DataSet ds = new DataSet();
    			ds.Tables.Add(dtEmpresa);
    			ds.Tables.Add(dtContrato);
    			ds.Tables.Add(dtUsuario);
    
    			return ds;
    

    terça-feira, 15 de fevereiro de 2011 11:22
  • Pessoal, estou com um baita problema e não consigo resolver, preciso de ajuda urgente. Preciso preencher minha Data Table com os valores que estão no banco, são 3 DataTables, adicionei elas dentro de um DataSet, porém quero fazer com que o retorno siga as normas das minhas query.  Porque depois esse método vou chamar no meu WebService. Alguém poderia me ajudar?

    public DataSet RetornaCargaInicial(int pIdUsuario)
    		{
    		 DataTable dtEmpresa = new DataTable();
    
    		 dtEmpresa.Columns.Add("IdEmpresa", typeof(int));
    		 dtEmpresa.Columns.Add("CNPJ", typeof(string));
    		 dtEmpresa.Columns.Add("InscricaoEstadual", typeof(string));
    		 dtEmpresa.Columns.Add("NomeFantasia", typeof(string));
    		 dtEmpresa.Columns.Add("RazaoSocial", typeof(string));
    
    DataTable dtContrato = new DataTable();
    
    			dtContrato.Columns.Add("IdContrato", typeof(int));
    			dtContrato.Columns.Add("IdEmpresa", typeof(int));
    			dtContrato.Columns.Add("NomeContrato", typeof(string));
    			dtContrato.Columns.Add("Contato", typeof(string));
    
    DataTable dtUsuario = new DataTable();
    
    			dtUsuario.Columns.Add("IdUsuario", typeof(int));
    			dtUsuario.Columns.Add("IdEmpresa", typeof(int));
    			dtUsuario.Columns.Add("IdPerfil", typeof(int));
    			dtUsuario.Columns.Add("IdTipoUsuario", typeof(Byte));
    
    			var QueryEmpresa =
    				 from a in linkitDataContext.Empresas
    				 join b in linkitDataContext.Usuarios on a.IdEmpresa equals b.IdEmpresa
    				 where b.IdUsuario == pIdUsuario
    				 select b;
    
    			var contratos =
    				from c in linkitDataContext.Contratos
    				join d in linkitDataContext.Usuarios on c.IdEmpresa equals d.IdEmpresa
    				where d.IdUsuario == pIdUsuario
    				select d;
    
    			var usuarios =
    				from e in linkitDataContext.Usuarios
    				where e.IdUsuario == pIdUsuario
    				select e;
    
    
    			DataSet ds = new DataSet();
    			ds.Tables.Add(dtEmpresa);
    			ds.Tables.Add(dtContrato);
    			ds.Tables.Add(dtUsuario);

     

    terça-feira, 15 de fevereiro de 2011 12:04
  • Heron,

    Como assim não esão passando por seus códigos LINQ? Você poderia explicar de outra forma?


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    terça-feira, 15 de fevereiro de 2011 12:12
    Moderador
  • Sim, eu talves não esteja conseguindo explicar bem, poxa estu quebrando a cabeça com isso, vamos lá.

    Foi pedido um requisito p/ mim:

    Ao iniciar o uso do PDA, a carga inicial de dados basicos para o funcionamento deve ser feito. Para isto será necessário retornar ao PDA uma lista de DataTables com as informações de cada tabela.

    Empresa = Buscar somente os dados da empresa do usuário
    Contrato = Buscar somente os dados dos contratos vinculados com o usuário
    Usuario = Buscar somente os dados do usuário

    ou seja, tenho tenho que retornar 3 DataTables que são esses que criei :

    ataTable dtEmpresa = new DataTable();
    
    		 dtEmpresa.Columns.Add("IdEmpresa", typeof(int));
    		 dtEmpresa.Columns.Add("CNPJ", typeof(string));
    		 dtEmpresa.Columns.Add("InscricaoEstadual", typeof(string));
    		 dtEmpresa.Columns.Add("NomeFantasia", typeof(string));
    		 dtEmpresa.Columns.Add("RazaoSocial", typeof(string));
    
    DataTable dtContrato = new DataTable();
    
    			dtContrato.Columns.Add("IdContrato", typeof(int));
    			dtContrato.Columns.Add("IdEmpresa", typeof(int));
    			dtContrato.Columns.Add("NomeContrato", typeof(string));
    			dtContrato.Columns.Add("Contato", typeof(string));
    
    DataTable dtUsuario = new DataTable();
    
    			dtUsuario.Columns.Add("IdUsuario", typeof(int));
    			dtUsuario.Columns.Add("IdEmpresa", typeof(int));
    			dtUsuario.Columns.Add("IdPerfil", typeof(int));
    			dtUsuario.Columns.Add("IdTipoUsuario", typeof(Byte));
    
    

    Porém, não sei como posso fazer o retorno disso, pois esses datatables, tem que pegar o conteudo da base de dados, ele tem que ser populado pelos dados do Banco . Daí fiz o seguinte, criei as querys LINQ :

    var QueryEmpresa =
    				 from a in linkitDataContext.Empresas
    				 join b in linkitDataContext.Usuarios on a.IdEmpresa equals b.IdEmpresa
    				 where b.IdUsuario == pIdUsuario
    				 select b;
    
    			var contratos =
    				from c in linkitDataContext.Contratos
    				join d in linkitDataContext.Usuarios on c.IdEmpresa equals d.IdEmpresa
    				where d.IdUsuario == pIdUsuario
    				select d;
    
    			var usuarios =
    				from e in linkitDataContext.Usuarios
    				where e.IdUsuario == pIdUsuario
    				select e;
    
    Porém, agora como posso retornar os data tables?? assim como pede no requisito? fiz com DataSet assim como me orientou, porém ainda fiquei na dúvida. E depois disso tenho que instânciar minha classe no meu WebService, pois ela será usada nela(WebService).

     

    Conseguiu entender André?? poxa me ajuda ai =(

    terça-feira, 15 de fevereiro de 2011 12:19
  • Heron,

    O seu problema é que vc não esta fazendo nada com o seus datatables...

    Primeiramente, leve em consideração que DataSet e DataTable é uma solução obsoleta que era usada antes do surgimento do linq... a ideia é ir parando de usar os mesmos na medida do possivel...

    vc pode retornar 3 IEnumerables no lugar... para isso seria mais pratico criar uma classe de retorno..

    public class RespostaCargaInicial {
          public IEnumarable<Empresa> Empresas { get; set; }
          public IEnumarable<Contrato> Contratos { get; set; }
          public IEnumarable<Usuario> Usuarios{ get; set; }
        }
    
        public RespostaCargaInicial RetornaCargaInicial(int pIdUsuario) {
          RespostaCargaInicial retorno = new RespostaCargaInicial();
          retorno.Empresas = (from a in linkitDataContext.Empresas
                    join b in linkitDataContext.Usuarios on a.IdEmpresa equals b.IdEmpresa
                    where b.IdUsuario == pIdUsuario
                    select b).AsEnumarable();
    
          retorno.Contratos = (from c in linkitDataContext.Contratos
                     join d in linkitDataContext.Usuarios on c.IdEmpresa equals d.IdEmpresa
                     where d.IdUsuario == pIdUsuario
                     select d).AsEnumarable();
    
          retorno.Usuarios = (from e in linkitDataContext.Usuarios
                    where e.IdUsuario == pIdUsuario
                    select e).AsEnumerable();
    
          return retorno;
        }
    

    Agora se vc esta retornando DataTables, devido algum motivo de compatibilidade com um sistema antigo...  de uma olhada nestes links...

    http://msdn.microsoft.com/en-us/library/bb386921.aspx
    http://unboxedsolutions.com/sean/archive/2009/06/06/15961.aspx

    • Marcado como Resposta Heron Dantas terça-feira, 15 de fevereiro de 2011 14:58
    terça-feira, 15 de fevereiro de 2011 12:29
    Moderador
  • Rui, muito obrigado pela ajuda, uma última pergunta, está dando esse erro, tem noção do que seja?

    Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<CoreLinkIT.Usuario>' to 'System.Collections.Generic.IEnumerable<CoreLinkIT.Empresa>'. An explicit conversion exists (are you missing a cast?)   

    e ele fica sublinhado em vermelho no .AsEnumerable(); onde possui join.

    OBS: O CoreLinkIT é um projeto dentro da minha solution onde estão minha dbml e a classe com os métodos. (que é a que estamos utilizando).

    terça-feira, 15 de fevereiro de 2011 13:04
  • Galera, corrigi, meu erro era que estava tentando transformar uma "empresa" em um "usuario". obrigado galera
    terça-feira, 15 de fevereiro de 2011 14:58