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.