Entity Framework Core 8 Где IN и Где IN OPENJSON Дополнительный вопросC#

Место общения программистов C#
Anonymous
Entity Framework Core 8 Где IN и Где IN OPENJSON Дополнительный вопрос

Сообщение Anonymous »

Я просмотрел другой пост по этому вопросу и обнаружил, что мой сценарий гораздо более неработоспособен, поскольку я не уверен, что проблема заключается в том, как я пишу запрос. Конечно, так и должно быть, поскольку это смехотворно медленно.
Приведенный пример покажет скорость выполнения с помощью 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();
Еще раз обратите внимание, что список идентификаторов — это просто список Guid
[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]
)

Я изменил это, чтобы использовать коллекцию, а не открытый JSON, и она запускалась мгновенно:
[img]https://i.sstatic .net/XWgvMV0c.png[/img]

Пример кода с использованием переменной для хранения каждой записи в цикле идентификаторов. (это не то, что я хотел сделать, чтобы избежать проблемы с OpenJSON)
Изображение
Изображение

Спасибо за ваш перспективы и помощь.

Подробнее здесь: https://stackoverflow.com/questions/785 ... l-question

Вернуться в «C#»