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á:
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