Como faço para unir dois resultados de uma query? – c# sql .net

Pergunta:


Estou desenvolvendo uma aplicação em C# e gostaria de saber como faço para unir dois resultados de duas queries SQL em uma só. Tenho o seguinte código:

public List<MalaDireta> ObterMalaDireta()
{    
    List<MalaDireta> resultado = new List<MalaDireta>();

    string sql_funcionario = "select id, nome, email from funcionario";
    string sql_fornecedor = "select id, nome, email from fornecedor";

    var conexao = new SqlConnection("string de conexão");

    var comando = new SqlCommand(sql_funcionario, conexao);

    try
    {
       conexao.Open();

       // como eu monto meu comando com as duas queries?

       var dataReader = comando.ExecuteReader();
       while (dataReader.Read())
       {
          MalaDireta m = new MalaDireta();
          m.Nome = dataReader["nome"];
          m.Email = dataReader["email"];

          resultado.Add(m);
       }
    }
    catch
    {
    }
    finally
    {
       conexao.Close();
    }

    return resultado;
}

Autor da pergunta Felipe Oriani

Resposta Marconcilio Souza:

Que tal fazer a união através da própria query sql usando o UNION:

select id, nome, email from funcionario
union
select id, nome, email from fornecedor

No seu caso ficaria assim:

string sql_todos = "select id, nome, email from funcionario " +
                   "union "+
                   "select id, nome, email from fornecedor";

A resposta do @Ecil está adequada, mas acrescento o uso do UNION ALL.

Qual a diferença entre UNION e UNION ALL?

  • UNION faz uma espécie de DISTINCT, inibindo resultados repetidos
  • UNION ALL traz todos os resultados, mesmo os com valores repetidos

Existe alguma vantagem no UNION ALL? Em tese, ele é mais eficiente por não aplicar o DISTINCT, isto é, não fazendo comparação dos valores dos registros.

Então basta uma mudança simples:

string sql_todos = "select id, nome, email from funcionario " +
               "union all "+
               "select id, nome, email from fornecedor";

Este conceito se aplica, pelo menos, ao SQL Server, Oracle, MySQL e PostgreSQL.

Em teoria, basta você repetir o processo de reabrir a conexão, executar a outra query, e passar pelo laço de repetição adicionando os resultados da sua segunda query.

string sql_funcionario = "select id, nome, email from funcionario";
string sql_fornecedor = "select id, nome, email from fornecedor";

var conexao = new SqlConnection("string de conexão");


MalaDireta m = new MalaDireta();
var comando = new SqlCommand(sql_funcionario, conexao);

try
{
   conexao.Open();

   // como eu monto meu comando com as duas queries?

   var dataReader = comando.ExecuteReader();
   while (dataReader.Read())
   {

      m.Nome = dataReader["nome"];
      m.Email = dataReader["email"];

      resultado.Add(m);
   }
}
catch
{
}
finally
{
   conexao.Close();
}

var comando = new SqlCommand(sql_fornecedor, conexao);

try
{
   conexao.Open();

   // como eu monto meu comando com as duas queries?

   var dataReader = comando.ExecuteReader();
   while (dataReader.Read())
   {

      m.Nome = dataReader["nome"];
      m.Email = dataReader["email"];

      resultado.Add(m);
   }
}
catch
{
}
finally
{
   conexao.Close();
}

Existem duas formas:

  1. Se a estrutura das suas queries forem as mesmas você pode usar um UNION:

var query = "select id, nome, email from funcionario union select id, nome, email from fornecedor";

  1. Você pode enviar as duas queries no mesmo SqlCommand. A Classe DataReader suporta nativamente múltiplos resultados usando o método dataReader.NextResult():

        var comando = new SqlCommand(string.Concat(sql_funcionario, ";", sql_fornecedor), conexao);
        var dataReader = comando.ExecuteReader();
        while (dataReader.NextResult()) {
            while (dataReader.Read()) {
                MalaDireta m = new MalaDireta();
                m.Nome = dataReader["nome"];
                m.Email = dataReader["email"];
    
                resultado.Add(m);
            }
        }
    

Caro, mesmo que alguma mágica oculta possa ser feita para unir os dois readers para readibilidade eu só vejo duas opções:

  1. Põe um union na query e coloca a business logic pro lado do banco. (meio feio)
  2. Pega os dois readers (converte pra Enumerable da entidade) e faz um merge com Linq, pode escrever uns Unit Tests para fazer o codigo responsável

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *