2016-03-02 1 views
0

J'ai un code comme ceci:ExecuteReaderAsync avec ReadAsync et ObjectContext.Translate saute première ligne

List<Models.MyModel> myobjects = new List<Models.MyModel>(); 
using (SqlDataReader reader = await cmd.ExecuteReaderAsync()) 
{ 
    if(await reader.ReadAsync()) 
    { 
     myobjects.AddRange(((IObjectContextAdapter)this) 
     .ObjectContext 
     .Translate<Models.MyModel>(reader, 
      GetEntitySetName<DbModels.MyModel>(), 
      MergeOption.NoTracking); 
    } 
} 

Cependant, cette première ligne permet de sauter la ResultSet. Si je change cela à

List<Models.MyModel> myobjects = new List<Models.MyModel>(); 
using (SqlDataReader reader = await cmd.ExecuteReaderAsync()) 
{ 
    //if(await reader.ReadAsync()) 
    { 
     myobjects.AddRange(((IObjectContextAdapter)this) 
     .ObjectContext 
     .Translate<Models.MyModel>(reader, 
      GetEntitySetName<DbModels.MyModel>(), 
      MergeOption.NoTracking); 
    } 
} 

Je récupère toutes les lignes. Est-ce que quelqu'un a rencontré ça? Si oui, existe-t-il une solution de contournement ou une façon différente d'appeler? Les appels synchrones correspondants cmd.ExecuteReader() et reader.Read() s'exécutent sans problème et retournent toujours toutes les lignes.

+0

C'est probablement parce que la méthode 'Translate'" prend possession "du lecteur et fait le premier appel à 'Read' (ou' ReadAsync'). Essayez-vous simplement de comprendre le pourquoi ou y a-t-il un problème? – CodingGorilla

Répondre

0

Après avoir appelé await reader.ReadAsync() dans votre condition if vous avez déplacé le lecteur à la ligne suivante. Ensuite, vous avez passé le lecteur à la méthode Translate afin qu'il continue à lire. Puisque vous avez déjà consommé quelques lignes Translate ne peut plus les lire (c'est-à-dire qu'il ne peut pas réinitialiser le lecteur pour commencer à lire depuis la première ligne)