Converter dados de um SqlDataReader para uma List com LINQ
Recorrendo ao SqlDataReader, facilmente conseguimos retornar dados de uma BD para a nossa aplicação.
Um exemplo muito rápido da sua utilização poderia ser algo como:
public class Person { public string Nome { get; set; } public int Idade { get; set; } }
public List<Person> GetPersons() { List<Person> persons = new List<Person>(); using (SqlCommand cmd = new SqlCommand("SELECT * FROM Persons", new SqlConnection("a_minha_connectionstring"))) { cmd.Connection.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { if (!dr.HasRows) return null; while (dr.Read()) { persons.Add(new Person() { Nome = dr["Nome"].ToString(), Idade = int.Parse(dr["Idade"].ToString()) }); } return persons; } } }
Nada de mal com este código, pois criamos uma lista que vai ter o tipo Person, e vamos adicionando no ciclo while() várias instâncias da classe Person.
Mas podemos torna-lo muito mais simples recorrendo ao LINQ e à Interface IDataRecord. Assim, o método GetPersons() seria algo como:
public List<Person> GetPersons() { using (SqlCommand cmd = new SqlCommand("SELECT * FROM Persons", new SqlConnection("a_minha_connectionstring"))) { cmd.Connection.Open(); return (from IDataRecord p in cmd.ExecuteReader() select new Person() { Nome = p["Nome"].ToString(), Idade = int.Parse(p["Idade"].ToString()) }).ToList(); } }
Muito mais claro, menos código, e o resultado será igual.