2016-03-02 96 views
0

我有这样的代码:ExecuteReaderAsync与ReadAsync和ObjectContext.Translate跳过第一行

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); 
    } 
} 

然而,这种跳过第一行中的结果集。如果我将其更改为

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); 
    } 
} 

我找回所有行。有没有人遇到过这个?如果是这样,是否有解决方法或不同的方式来打电话?相应的同步调用cmd.ExecuteReader()reader.Read()运行没有任何问题,并始终返回所有行。

+0

这可能是因为'Translate'方法“取得了读者的所有权”并首次调用“Read”(或“ReadAsync”)。你只是想明白为什么,或者是否有问题? – CodingGorilla

回答

0

if条件中调用await reader.ReadAsync()后,您将读者移至下一行。然后,您将阅读器传递给Translate方法,以便继续读取它。由于您已经消耗了一些行Translate无法再读取它们(即无法重置读取器开始从第一行读取)