私はこのlinqを持っています:
using (PlantContext context = ContextManager.GetPlantContext(plantId.PlantPath))
{
results = (from p in context.Plants
join subplant in context.Subplants on p.Id equals subplant.PlantId
join inverter in context.Inverters on subplant.Id equals inverter.SubplantId
join inverterActualData in context.InverterActualDatas on inverter.Id equals inverterActualData.InverterId into joinAll
from joinItem in joinAll.DefaultIfEmpty()
select new
{
ActualData = joinItem,
Inverter = inverter,
Subplant = subplant,
Plant = p
}).AsEnumerable().Select(r => r.Inverter).ToList();
}
その後、結果を確認したいと思います。
foreach (Inverter inverter in results)
{
if (inverter.InverterActualData == null)
{
}
}
これにより、「if (inverter.InverterActualData == null)」行で次の例外がスローされます。
An exception of type 'System.ObjectDisposedException' occurred in System.Data.Entity.dll but was not handled in user code
私がやろうとしているのは、インバーターのリストを取得することですが、同時にその Subplant および InverterActualData プロパティをロードします。(また、Subplant の場合、Plant プロパティを読み込みます)。
この問題は、インバーターの InverterActualData レコードがない場合に発生します。この場合、例外がスローされます。
コンテキストが閉じられる前にすべてのデータをロードしたいのはなぜですか? データベースへの 1 回のトリップは、各インバーターの InverterActualData を個別に呼び出すよりもはるかに高速であるためです。
ご覧のとおり、InverterActualData プロパティが null かどうかを確認しようとしていますが、ロードされていないようです。関係なく、例外がスローされます。
私も追加しようとしました:
join inverter in context.Inverters.Include(InverterExtension.Relations.InverterActualData) on subplant.Id equals inverter.SubplantId
しかし、これもうまくいきません。
プロファイラーでは、クエリは次のように変換されるため、私には奇妙に思えます。
SELECT 1 AS [C1],
[Extent4].[InverterId] AS [InverterId],
[Extent4].[Period] AS [Period],
[Extent4].[OperatingHours] AS [OperatingHours],
[Extent3].[Id] AS [Id],
[Extent3].[InverterTypeId] AS [InverterTypeId],
[Extent3].[SubplantId] AS [SubplantId],
[Extent3].[Name] AS [Name],
[Extent2].[Id] AS [Id1],
[Extent2].[PlantId] AS [PlantId],
[Extent2].[Name] AS [Name1],
[Extent1].[Id] AS [Id2],
[Extent1].[Name] AS [Name2],
FROM [Plant] AS [Extent1]
INNER JOIN [Subplants] AS [Extent2] ON [Extent1].[Id] = [Extent2].[PlantId]
INNER JOIN [Inverters] AS [Extent3] ON [Extent2].[Id] = [Extent3].[SubplantId]
LEFT OUTER JOIN [InverterActualData] AS [Extent4] ON [Extent3].[Id] = [Extent4].[InverterId]
これはまさに私が欲しいものです。また、DB でこのクエリを実行すると、Inverter、Subplant、Plant のデータと、InverterActualData のデフォルト値が取得されます。
何が問題なのですか?