如何避免"已经有一个与此Connection相关联的打开的DataReader必须先关闭." 在MySql/net连接器?

Bru*_*ero 5 c# mysql-connector linq-to-sql asp.net-mvc-3

我有以下这段代码:

public TimestampedRowStorage GetTimestampedRowStorage(string startTime, string endTime, long trendSettingID, int? period)
    {
        var timestampedList = (from t in dataContext.TrendRecords
                                     where t.TrendSetting_ID == trendSettingID
                                     select t).ToList();

        return new TimestampedRowStorage
        {
            TimestampedDictionary = timestampedList.ToDictionary(m => m.Timestamp,
                m => (from j in dataContext.TrendSignalRecords
                      where j.TrendRecord_ID == m.ID
                      select j).ToDictionary(p => p.TrendSignalSetting.Name,
                p => (double?)p.Value))
        };
    }
Run Code Online (Sandbox Code Playgroud)

但我总是得到以下例外:

已经有一个与此Connection关联的开放DataReader,必须先关闭它.

这是堆栈跟踪:

[MySqlException(0x80004005):已经有一个与此Connection关联的打开DataReader,必须先关闭它.]
MySql.Data.MySqlClient.MySqlCommand.CheckState()+237 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)+ 146
MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)+47
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)+10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)+443

[EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)+479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context,ObjectParameterCollection parameterValues)+736
System.Data. Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOption)+149
System.Data.Objects.ObjectQuery 1.Load(MergeOption mergeOption)+148 System.Data.Objects.DataClasses.RelatedEnd.Load()+37 System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad ()+8032198 System.Data.Objects.DataClasses.EntityReference 1 source,Func 2 elementSelector,IEqualityComparer 1 source,Func 2 elementSelector)+54 Nebula.Models.Trends.TrendRepository.b__a(TrendRecord m)in C:\ Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:227 System.Linq.Enumerable.ToDictionary(IEnumerable 2 keySelector,Func 1 comparer )+240 System.Linq.Enumerable.ToDictionary(IEnumerable 2 keySelec tor,Func 1期)在C:\ Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:224 Nebula.Models.Trends.TrendRepository.GetTrendSettingContainer(String startTime,String 在C:\ Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs中的endTime,Int64 unitID,Int64 plantID,Int64 trendSettingID,GridSortOptions gridSortOptions,Nullable 1 recordsPerPage,Nullable 1 allTrends) :206 Nebula.Controllers.GeneratingUnitController.TrendSettings(Int64 id,Int64 plantID,Int64 trendSettingID,String startTime,String endTime,Nullable 1 recordsPerPage,GridSortOptions options,Nullable 1 allTrends)C:\ Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Controllers\GeneratingUnitController.cs:148 lambda_method(Closure,ControllerBase,Object [])+5431.Execute(MergeOption mergeOption) +31
System.Data.Objects.DataClasses.EntityReference

1.get_Value() +12 Nebula.Models.TrendSignalRecord.get_TrendSignalSetting() in C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\SmgerDataModel.Designer.cs:2528 Nebula.Models.Trends.TrendRepository.<GetTimestampedRowStorage>b__b(TrendSignalRecord p) in C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:229 System.Linq.Enumerable.ToDictionary(IEnumerable2 keySelector, Func1 comparer) +226
System.Linq.Enumerable.ToDictionary(IEnumerable
2 keySelector, Func
1 source, Func2 elementSelector, IEqualityComparer
1 source, Func2 elementSelector) +53
Nebula.Models.Trends.TrendRepository.GetTimestampedRowStorage(String startTime, String endTime, Int64 trendSettingID, Nullable
1 page, Nullable1 period, Int64[] trends, Nullable1 page, Nullable1 period, Int64[] trends, Nullable

你能帮助我吗?

Tej*_*ejo 10

该错误可能是因为您在访问数据库时尝试访问数据库.您应该尝试将两个Linq表达式分开.也许这样的东西:

var TimestampedList = (from t in dataContext.TrendRecords
                                         where t.TrendSetting_ID == trendSettingID
                                         select t).ToList();
TimestampedDictionary = timestampedList.ToDictionary(m => m.Timestamp,
                    m => (from j in dataContext.TrendSignalRecords
                          where j.TrendRecord_ID == m.ID
                          select j).ToDictionary(p => p.TrendSignalSetting.Name,
                    p => (double?)p.Value))
Run Code Online (Sandbox Code Playgroud)


Lad*_*nka 8

我假设MySql连接器不支持MARS(多个活动结果集).在这种情况下你不能这样做:

L2SQuery.ToDictionary(m => m.Timestamp, m => AnotherL2SQuery)
Run Code Online (Sandbox Code Playgroud)

执行此操作后,您将枚举第一个L2S查询的结果(= DataReader仍处于打开状态),并且您正在为第一个(=您需要第二个DataReader)记录执行第二个L2S查询.

您必须通过调用ToList并在该迭代结果和构建字典之后单独执行第一个查询.


ihe*_*heb 8

在第一个查询中调用.toList()