Vous ne devriez pas faire ça! Votre lecteur doit être fermé dès que possible. vous ne voulez pas le garder ouvert pendant la durée de l'énumération. Il est préférable de simplement créer une liste explicite et de la renvoyer.
var cmd = SqlCommand("select [EmpName] from [dbo].[Emp]");
List<string> results = new List<string>();
using (var rdr = cmd.ExecuteReader()) {
while (rdr.Read())
results.Add((string) rdr["EmpName"]);
}
return results;
Vous pouvez utiliser des expressions Linq sur un DataReader en le jetant:
using (var rdr = cmd.ExecuteReader()) {
results = (from row in rdr.Cast<DbDataRecord>()
select (string)row["EmpName"]).ToList();
}
Mais remarquez que vous besoin appeler ToList(), ou vous obtiendrez une erreur lorsque vous essayez d'énumérer parce que le lecteur a déjà été fermé.
Modifier
Il semble y avoir une certaine confusion dans les commentaires au sujet de ce qu'un DataReader ne fait quand il est ouvert. From MSDN:
Alors que le SqlDataReader est utilisé, le SqlConnection associé est occupé au service de la SqlDataReader, et aucune autres opérations peuvent être effectuées sur SqlConnection autre que la fermeture il. C'est le cas jusqu'à ce que la méthode Close de SqlDataReader soit appelée. Par exemple, vous ne pouvez pas récupérer les paramètres de sortie tant que vous n'avez pas appelé Fermer.
Par conséquent, vous devriez le fermer dès que possible pour libérer la connexion.
C'est clair et concis. Activez complètement LINQ to SQL ou laissez-le tel quel. Il n'y a rien de mal à «rendement rendement». –
@JoelFan, qu'est-ce qui ne va pas avec * yield return *? C'est comme ça que je le ferais aussi. –
@Stan, le problème est que vous laissez votre connexion ouverte plus longtemps que ce qu'elle devrait être –