La meilleure méthode à utiliser IDataReader comme IEnumerable<T>?
J'ai besoin d'utiliser Linq sur toute IDataReader implémentations comme ce
var c = sqlDataReader.AsEnumerable().Count();
Exemple:
public abstract class Test
{
public abstract SqlDataReader GetSqlDataReader();
public void Foo()
{
SqlDataReader sqlDataReader = GetSqlDataReader();
IEnumerable<SqlDataReader> sqlEnumerable = sqlDataReader.AsEnumerable();
var c = sqlEnumerable.Count();
var s = sqlEnumerable.Sum();
SqlDataReader first = sqlEnumerable.First();
var t = first.GetSqlXml(10);
}
}
Quelle est la meilleure méthode pour écrire cela.
Veuillez écrire votre code.
Vous devez vous connecter pour publier un commentaire.
Essayer, c':
Vous pouvez utiliser ceci:
Mais n'oubliez pas de linq instruction execute avant de fermer le DataReader.
à l'aide de ToList() par exemple
Vous pouvez créer une méthode d'extension pour ce faire (voir mises en garde ci-dessous):
Trouve ici: http://www.thinqlinq.com/default/Consuming-a-DataReader-with-LINQ.aspx
Comme l'a souligné @LukeH, notez que comme IDataReader prend uniquement en charge la lecture une fois, en avant, seulement, vous serez en mesure d'interroger le énumérable une fois. (Pour obtenir autour de ce que vous pourriez appeler ToList/ToArray, puis requête).
Noter que
SqlDataReader
déjà impliments IEnumerable de sorte que vous n'aurez pas besoin de faire cela dans l'exemple que vous avez donné.Aussi, sachez que c'est probablement mieux de le faire tout de filtrage/aggrigating sur le serveur (via LINQ to SQL par exemple)
Count
suivie parSum
suivit parFirst
comme dans l'exemple. (Bien que faire de ce qu'ils avaient besoin de ré-interroger la db trois fois, ou les résultats en mémoire tampon en quelque sorte, qui ont tous deux écueils potentiels.)SqlDataReader
, vous n'êtes pas à l'énumération sur plus d'unSqlDataReader
.SqlDataReader
, leSqlDataReader
est la chose à faire l'énumération. Je suis désolé, je n'ai toujours pas de suivre votre cas d'utilisation.SqlDataReader
etIDataReader
, ni de leur mise en œuvreIEnumerable
...?Voici mes deux cents :
J'ai ressenti l'envie de publier ce post, car il est très important de disposer d'un
DataReader
après utilisation, et pas de réponse mentionné.C'est pourquoi mon application a un
using
déclaration autour de lawhile
boucle. De cette façon, je peux le faire "d'une part" les requêtes sans se soucier de laDataReader
disposition.using
instruction et de l'importance de la fermeture de la datareader. Dans certains environnements, le DataReader pourrait effectivementLock
une base de données, table, feuilles, etc.Vous pouvez simplement charger le
DataReader
dans unDataTable
et puisSelect()
:ou
J'ai utilisé ce qui suit, mais j'aime @Serge suggestion du mieux et il rappelle de ce que je crois que j'ai utilisé pour faire, mais ensuite il a oublié que IDataReader implémente