Приведенный пример покажет скорость выполнения с помощью Where IN OPENJSON в сравнении со скоростью запроса этого вручную и работой с одной записью за раз. и добавление в список.
Я хотел бы работать с IQueryable, а не заполнять переменную каждой записью в цикле, лол.
Код Пример того, как я хотел бы его написать (преобразуется в WHERE IN OpenJSON)
Этот пример занял 25 секунд и содержит пару снимков экрана, показывающих точку останова перед вводом запроса и точку останова после завершения области. интересная работа.
Код: Выделить всё
// this is just a List of GUIDs
var relatedWorkflowIds = await dbContext.Database.SqlQuery($"EXEC GetChildIdsFromParentWorkflowInstance {request.Id}").ToListAsync();
var query =
dbContext.WorkflowInstanceStepHistories.AsNoTracking()
.Where(wish => relatedWorkflowIds.Contains(wish.WorkflowInstanceId.Value));
var queryWithIncludedData = await query
.Include(wish => wish.WorkflowStepOutcome).AsNoTracking()
.Include(wish => wish.WorkflowInstanceStep).ThenInclude(wis => wis.WorkflowStep).ThenInclude(ws => ws.Workflow).AsNoTracking()
.Include(wish => wish.WorkflowInstanceStep).ThenInclude(wis => wis.WorkflowStep).ThenInclude(ws => ws.WorkflowStepType).AsNoTracking()
.ToListAsync();
[img]https://i.sstatic.net /oTqutOOA.png[/img]

Вывод кода SQL
Код: Выделить всё
Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (25,016ms) [Parameters=[@__relatedWorkflowIds_0='?' (Size = 4000)], CommandType='Text', CommandTimeout='30']
SELECT [w].[Id], [w].[CreatedOnUtc], [w].[LastUpdatedBy], [w].[ModifiedOnUtc], [w].[NewRecipient], [w].[Notes], [w].[Recipient], [w].[Reference], [w].[WorkflowInstanceId], [w].[WorkflowInstanceStepId], [w].[WorkflowStepOutcomeId], [w].[WorkflowStepStatus], [w0].[Id], [w0].[CreatedOnUtc], [w0].[IsUserSelectable], [w0].[LastUpdatedBy], [w0].[ModifiedOnUtc], [w0].[WorkflowStepOutcome], [w1].[Id], [w1].[CreatedOnUtc], [w1].[LastUpdatedBy], [w1].[ModifiedOnUtc], [w1].[Recipient], [w1].[WorkflowInstanceId], [w1].[WorkflowStepId], [w2].[Id], [w2].[CreatedOnUtc], [w2].[Description], [w2].[HelpId], [w2].[LastUpdatedBy], [w2].[ModifiedOnUtc], [w2].[Name], [w2].[Recipient], [w2].[WorkflowId], [w2].[WorkflowStepTypeId], [w3].[Id], [w3].[CreatedOnUtc], [w3].[Description], [w3].[EntryId], [w3].[IsActive], [w3].[LastUpdatedBy], [w3].[ModifiedOnUtc], [w3].[Name], [w3].[School], [w3].[WorkflowUsageId], [w4].[Id], [w4].[CreatedOnUtc], [w4].[LastUpdatedBy], [w4].[ModifiedOnUtc], [w4].[WorkflowStepType]
FROM [WorkflowInstanceStepHistories] AS [w]
LEFT JOIN [WorkflowStepOutcomes] AS [w0] ON [w].[WorkflowStepOutcomeId] = [w0].[Id]
LEFT JOIN [WorkflowInstanceSteps] AS [w1] ON [w].[WorkflowInstanceStepId] = [w1].[Id]
LEFT JOIN [WorkflowSteps] AS [w2] ON [w1].[WorkflowStepId] = [w2].[Id]
LEFT JOIN [Workflows] AS [w3] ON [w2].[WorkflowId] = [w3].[Id]
LEFT JOIN [WorkflowStepTypes] AS [w4] ON [w2].[WorkflowStepTypeId] = [w4].[Id]
WHERE [w].[WorkflowInstanceId] IN (
SELECT [r].[value]
FROM OPENJSON(@__relatedWorkflowIds_0) WITH ([value] uniqueidentifier '$') AS [r]
)
[img]https://i.sstatic .net/XWgvMV0c.png[/img]
Пример кода с использованием переменной для хранения каждой записи в цикле идентификаторов. (это не то, что я хотел сделать, чтобы избежать проблемы с OpenJSON)


Спасибо за ваш перспективы и помощь.
Подробнее здесь: https://stackoverflow.com/questions/785 ... l-question