Consulta Dinâmica ao Banco de Dados

Olá a todos, nesse tópico vou ensinar como se criar uma consulta dinâmica no banco de dados e retornar uma lista.

Neste exemplo eu usarei o postgres como banco de dados e o Npgsql como Driver para conexão com o banco de dados.

Primeiramente iremos criar um método para abrir e fechar a conexão com o banco de dados.

public NpgsqlConnection ConnectionHelper(bool Open)
{
	try
	{
		if (Open)
		{
			if (con == null)
				con = new NpgsqlConnection(stringConnection);

			if (con.State != ConnectionState.Open)
				con.Open();
		}
		else
		{
			if (con == null || con.State == ConnectionState.Closed)
				return null;

			con.Close();
		}
	}
	catch (Exception e)
	{
		throw new Exception(e.Message, e);
	}
        return con;
}

Agora iremos criar o método que executara as querys no banco de dados que receba o resultado e grave dinamicamente em uma lista.

Para isso vamos usar uma variável do tipo “dynamic”, que nos permite carregar uma lista sem conhecer as propriedades.

public object ExecutaComando()
{
	try
	{
		NpgsqlCommand comand = new NpgsqlCommand(comando, con);

		if (!returnList)
		{
			comand.ExecuteNonQuery();
			return null;
		}

		if (string.IsNullOrEmpty(typeReturn))
			throw new DynamicException("Defina um valor para o parametro TypeReturn!");

		Assembly asm = Assembly.GetCallingAssembly();

		Type type = asm.GetType(typeReturn, true);

		if (type == null)
			throw new DynamicException("Não encontrada a referencia " + typeReturn);

		PropertyInfo[] propInfo = type.GetProperties();

		dynamic _returnValue = CreateGeneric(typeof(List<>), type);

		IDataReader dr = comand.ExecuteReader();

		while (dr.Read())
		{
			dynamic item = Activator.CreateInstance(type);

			foreach (PropertyInfo prop in propInfo)
			{
				string pName = prop.Name;
				Type pType = prop.PropertyType;

				var value = dr[pName.GetNameColumn()].ChangeType(pType);

				prop.SetValue(item, value);
			}

			_returnValue.Add(item);
		}
		

		return _returnValue;

	}
	catch (DynamicException e)
	{
		throw new DynamicException(e.Message, e);
	}
}

Neste método eu carrego o tipo passado através de um parâmetro e crio uma lista do tipo dynamic e gravo os dados em uma lista e a retorno.

Segue um exemplo de como fazer uma consulta dinâmica usando nosso exemplo:

static void Main(string[] args)
{
	try
	{
		HelperDba Dba = new HelperDba();

		Dba.Comando = "SELECT * FROM pessoa;";
		Dba.ReturnList = true;
		Dba.TypeReturn = "Dynamic_Query.Pessoa";
		Dba.StringConnection = "Server = 127.0.0.1; Port = 5432; Database = teste_db; User Id = postgres; Password = postgres; Timeout = 15;";

		Dba.ConnectionHelper(true);

		IList<Pessoa> list = (List<Pessoa>)Dba.ExecutaComando();

		foreach (Pessoa p in list)
			Console.WriteLine("Nome: " + p.Nome + " " + p.SobreNome + " - Idade: " + p.Idade);
	}
	catch(DynamicException e)
	{
		Console.WriteLine(e);
	}

	Console.ReadLine();
}

E nosso resultado será:

Resultado de uma consulta no banco usando métodos Dinâmicos.
Resultado de uma consulta no banco usando métodos Dinâmicos.

Para ver o código completo acesse meu repositório no GitHub https://github.com/rafaellincoln/Dynamic-Query

Se gostou compartilhe esse post e colabore com o projeto no GitHub.

Faça sugestões:
Através do meu Facebook: https://www.facebook.com/Rafael.Lincoln13
Ou através do meu Email: rafaellincolnpereira@gmail.com

Deixe um comentário