2017-10-06 14 views
0

J'interroge Azure Table Storage à l'aide de C#, qui renvoie un IEnumerable. J'utilise .Select() pour obtenir deux attributs différents de mon résultat, mais le nombre de chaque attribut n'est pas correct. Par exemple:IEnumerable.Select() retourne des résultats inattendus

IEnumerable<SomeClass> results = table.ExecuteQuery(query); 
IEnumerable<DateTime> dates = results.Select(x => x.Date); 
IEnumerable<double> doubles = results.Select(x => x.Doubles); 

Chaque résultat a une date et une double valeur (j'ai vérifié cela), de sorte que le nombre de chacun d'eux doit être exactement la même chose que l'autre et le résultat, mais ils reviennent différemment. Je pourrais avoir 300k résultats, puis 299.997 dates et 300.003 doubles.

Quand je fais quelque chose comme:

results.ToList(); 

puis utilisez .Choisir() j'obtenir les résultats corrects. J'essaie d'éviter de convertir les enregistrements en liste d'abord parce que cela prend trop de temps. Je veux aussi éviter d'utiliser une boucle for ou une boucle foreach car elles prennent beaucoup trop de temps.

Ma question est: Y at-il un moyen d'utiliser .Select() sur un IEnumerable et obtenir des résultats précis? Ou y a-t-il une autre façon de faire cela qui serait très rapide? REMARQUE: Je trace ces données sur un graphe xy et pour environ 300 000 enregistrements, cela prend environ 1 minute et 30 secondes. Environ 90% de ce temps est dû à une boucle foreach que j'avais. Si je convertis en une liste, cela prend encore plus de temps à traiter. Utiliser le .Select() sur un IEnumerable est très rapide mais j'ai besoin de résultats fiables et la quantité de valeurs x doit être la même que celle de y.

+0

La date est-elle peut-être égale à 'DateTime.MinValue' sur certaines lignes? Peut-être que l'ATS saute effectivement cela? –

+1

Comment vérifier le nombre de lignes pour chaque résultat de requête? Dans les deux cas vous retournez 'IEnumerable' qui ne sera exécuté que lorsque vous l'itérez. – Fabio

+0

Non. J'ai entré ces enregistrements dans un environnement de test et la date est toujours la date à laquelle les données ont été affichées. – CSchroeder

Répondre

0

Azure tables/SDK utilise des énumérables paresseux. La requête http réelle au service de table pour extraire les entités n'est pas exécutée lorsque vous appelez executequery mais lorsque vous effectuez une itération sur les résultats Ienumerable renvoyés. C'est une possibilité pour laquelle vous voyez des résultats de diff au fur et à mesure que vous itérez sur l'énumérable par select peut-être que les données sur la table changent?