5

次のコードがあります。

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

しかし、私は常に次の例外を受け取ります:

この接続に関連付けられている開いている DataReader が既に存在し、最初に閉じる必要があります。

スタック トレースは次のとおりです。


[ MySqlException (0x80004005): この接続に関連付けられている開いている DataReader が既に存在します。これを最初に閉じる必要があります。] 146
MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior 動作) +47
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior 動作) +10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehavior 動作) +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 ソース、Func1.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, Func2 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 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 期間) C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:224 Nebula.Models.Trends.TrendRepository.GetTrendSettingContainer(String startTime, String endTime, Int64 1 page, NullableC 1 period, Int64[] trends, Nullable:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Models\Trends\TrendRepository.cs:206星雲.Controllers.GeneratingUnitController.TrendSettings(Int64 id, Int64 plantID, Int64 trendSettingID, String startTime, String endTime, Nullable 1 page, Nullable1 recordsPerPage, GridSortOptions options, Nullable1 period, Int64[] trends, Nullable1 allTrends) C:\Users\Bruno Leonardo\documents\visual studio 2010\Projects\Nebula\Nebula\Controllers\GeneratingUnitController.cs:148 lambda_method(Closure , ControllerBase , Object[] ) +543

皆さん、私を助けてくれませんか?

4

4 に答える 4

10

エラーは、データベースにアクセスしているときにデータベースにアクセスしようとしていることが原因である可能性があります。2つの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))
于 2011-06-07T21:53:36.800 に答える
10

最初のクエリで .toList() を呼び出します

于 2013-01-30T12:40:31.150 に答える
9

MySqlコネクタはMARS(複数のアクティブな結果セット)をサポートしていないと思います。このような場合、これを行うことはできません。

L2SQuery.ToDictionary(m => m.Timestamp, m => AnotherL2SQuery)

これを行うと、最初のL2Sクエリの結果を列挙し(=DataReaderはまだ開いています)、最初のレコードの各レコードに対して2番目のL2Sクエリを実行しています(= 2番目が必要ですDataReader)。

最初のクエリを呼び出しToListて個別に実行し、その後、結果を繰り返して辞書を作成する必要があります。

于 2011-06-07T21:53:50.157 に答える