Преобразование лямбда-запроса C# в хранимую процедуру SQL ⇐ C#
Преобразование лямбда-запроса C# в хранимую процедуру SQL
Мой опыт и знания хранимых процедур SQL несколько ограничены. Я надеялся получить помощь в преобразовании следующего запроса в хранимую процедуру SQL.
string[] Включает = новую строку[] { "IntakeData" }; var r = _repo.Filter (a => (a.TrackingIdentifier == trackNum || a.IntakeData.Requestor_CaseID == trackNum) && a.ResponseType == "ОТВЕТ" && a.Status == "ОК" && a.Destination == rs, включает) .OrderByDescending(d => d.CreatedDate) .Select(c => new { c.ResultStatus, c.Destination, c.IntakeData }) .FirstOrDefault(); Ниже приведен запрос, который я извлек из профилировщика SQL, но сгенерированный запрос SQL слишком сложен, и в результате генерируется множество ненужных проверок на ноль. Поэтому мы приняли решение упростить его, используя аналогичную хранимую процедуру.
exec sp_executesql N'SELECT TOP (1) [Проект1].[C1] КАК [C1], [Проект1].[ResultStatus] AS [ResultStatus], [Проект1].[Назначение] AS [Назначение], [Проект1].[ID] КАК [ID], [Проект1].[TrackingIdentifier] КАК [TrackingIdentifier], [Проект1].[ClientTrackingIdentifier] AS [ClientTrackingIdentifier], [Проект1].[RequestorEmail] КАК [RequestorEmail], [Project1].[CandidateEmail] КАК [CandidateEmail], [Проект1].[ConsumerIdentifier] AS [ConsumerIdentifier], [Проект1].[Идентификатор_локации] AS [Идентификатор_локации], [Проект1].[CandidateID] AS [CandidateID], [Проект1].[TotalCount] КАК [TotalCount], [Проект1].[KitIdentifier] КАК [KitIdentifier], [Проект1].[QueryStatus] AS [QueryStatus], [Проект1].[QueryData] КАК [QueryData], [Проект1].[Дата создания1] КАК [Дата создания], [Проект1].[CorporateEntityID] КАК [CorporateEntityID], [Проект1].[Requestor_CaseID] AS [Requestor_CaseID], [Проект1].[CandidateSMS] КАК [CandidateSMS], [Проект1].[NotificationType] AS [NotificationType], [Проект1].[REDTAILOrderCreationStatus] КАК [REDTAILOrderCreationStatus], [Проект1].[REDTAILOrderCreationErrorMessage] КАК [REDTAILOrderCreationErrorMessage], [Проект1].[APIInviteData] КАК [APIInviteData], [Проект1].[CRN] КАК [CRN] ОТ ( ВЫБРАТЬ [Фильтр1].[ResultStatus] AS [ResultStatus], [Фильтр1].[Назначение] AS [Назначение], [Фильтр1].[Дата создания1] КАК [Дата создания], [Экстент3].[ID] КАК [ID], [Extent3].[TrackingIdentifier] КАК [TrackingIdentifier], [Extent3].[ClientTrackingIdentifier] AS [ClientTrackingIdentifier], [Extent3].[RequestorEmail] КАК [RequestorEmail], [Extent3].[CandidateEmail] КАК [CandidateEmail], [Extent3].[ConsumerIdentifier] AS [ConsumerIdentifier], [Extent3].[LocationIdentifier] AS [LocationIdentifier], [Extent3].[CandidateID] AS [CandidateID], [Экстент3].[TotalCount] КАК [TotalCount], [Extent3].[KitIdentifier] КАК [KitIdentifier], [Extent3].[QueryStatus] AS [QueryStatus], [Extent3].[QueryData] КАК [QueryData], [Экстент3].[Дата создания] КАК [Дата создания1], [Extent3].[CorporateEntityID] AS [CorporateEntityID], [Extent3].[Requestor_CaseID] AS [Requestor_CaseID], [Extent3].[CandidateSMS] КАК [CandidateSMS], [Extent3].[NotificationType] AS [NotificationType], [Extent3].[REDTAILOrderCreationStatus] КАК [REDTAILOrderCreationStatus], [Extent3].[REDTAILOrderCreationErrorMessage] КАК [REDTAILOrderCreationErrorMessage], [Extent3].[APIInviteData] КАК [APIInviteData], [Экстент3].[CRN] КАК [CRN], 1 АС [C1] ИЗ (ВЫБЕРИТЕ [Extent1].[IntakeDataID] КАК [IntakeDataID], [Extent1].[TrackingIdentifier] КАК [TrackingIdentifier1], [Extent1].[ResultStatus] КАК [ResultStatus], [Extent1].[Destination] КАК [Destination] , [Extent1].[CreatedDate] AS [CreatedDate1], [Extent2].[Requestor_CaseID] AS [Requestor_CaseID] ИЗ [dbo].[ResultData] КАК [Extent1] ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ [dbo].[IntakeData] AS [Extent2] ON [Extent1].[IntakeDataID] = [Extent2].[ID] ГДЕ (''RESPONSE'' = [Extent1].[ResponseType]) И ([Extent1].[ResponseType] НЕ NULL) И (''OK'' = [Extent1].[Status]) AND ([Extent1] .[Состояние] НЕ NULL) ) AS [Filter1] ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ [dbo].[IntakeData] AS [Extent3] ON [Filter1].[IntakeDataID] = [Extent3].[ID] ГДЕ ((([Filter1].[TrackingIdentifier1] = @p__linq__0) И ( NOT ([Filter1].[TrackingIdentifier1] IS NULL ИЛИ @p__linq__0 IS NULL))) ИЛИ (([Filter1].[TrackingIdentifier1] IS NULL) И (@p__linq__0 IS NULL)) ИЛИ (([Filter1].[Requestor_CaseID] = @p__linq__1) И ( NOT ([Filter1].[Requestor_CaseID] NULL ИЛИ @p__linq__1 IS NULL))) ИЛИ (([Filter1].[ Requestor_CaseID] IS NULL) И (@p__linq__1 IS NULL))) И ((([Filter1].[Destination] = @p__linq__2) AND ( NOT ([Filter1].[Destination] IS NULL ИЛИ @p__linq__2 IS NULL))) ИЛИ (([Фильтр1].[Назначение] — NULL) И (@p__linq__2 — NULL))) ) АС [Проект1] ORDER BY [Project1].[CreatedDate] DESC',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000),@p__linq__2 varchar(8000)',@p__linq__0='06ONMJ99SN',@p__linq__1='06ONMJ99SN', @p__linq__2='АКЦИО' Любая помощь по упрощению сгенерированного SQL-запроса до меньшей хранимой процедуры будет принята с благодарностью. Я все еще изучаю SQL, поэтому буду благодарен за помощь.
Спасибо
Мой опыт и знания хранимых процедур SQL несколько ограничены. Я надеялся получить помощь в преобразовании следующего запроса в хранимую процедуру SQL.
string[] Включает = новую строку[] { "IntakeData" }; var r = _repo.Filter (a => (a.TrackingIdentifier == trackNum || a.IntakeData.Requestor_CaseID == trackNum) && a.ResponseType == "ОТВЕТ" && a.Status == "ОК" && a.Destination == rs, включает) .OrderByDescending(d => d.CreatedDate) .Select(c => new { c.ResultStatus, c.Destination, c.IntakeData }) .FirstOrDefault(); Ниже приведен запрос, который я извлек из профилировщика SQL, но сгенерированный запрос SQL слишком сложен, и в результате генерируется множество ненужных проверок на ноль. Поэтому мы приняли решение упростить его, используя аналогичную хранимую процедуру.
exec sp_executesql N'SELECT TOP (1) [Проект1].[C1] КАК [C1], [Проект1].[ResultStatus] AS [ResultStatus], [Проект1].[Назначение] AS [Назначение], [Проект1].[ID] КАК [ID], [Проект1].[TrackingIdentifier] КАК [TrackingIdentifier], [Проект1].[ClientTrackingIdentifier] AS [ClientTrackingIdentifier], [Проект1].[RequestorEmail] КАК [RequestorEmail], [Project1].[CandidateEmail] КАК [CandidateEmail], [Проект1].[ConsumerIdentifier] AS [ConsumerIdentifier], [Проект1].[Идентификатор_локации] AS [Идентификатор_локации], [Проект1].[CandidateID] AS [CandidateID], [Проект1].[TotalCount] КАК [TotalCount], [Проект1].[KitIdentifier] КАК [KitIdentifier], [Проект1].[QueryStatus] AS [QueryStatus], [Проект1].[QueryData] КАК [QueryData], [Проект1].[Дата создания1] КАК [Дата создания], [Проект1].[CorporateEntityID] КАК [CorporateEntityID], [Проект1].[Requestor_CaseID] AS [Requestor_CaseID], [Проект1].[CandidateSMS] КАК [CandidateSMS], [Проект1].[NotificationType] AS [NotificationType], [Проект1].[REDTAILOrderCreationStatus] КАК [REDTAILOrderCreationStatus], [Проект1].[REDTAILOrderCreationErrorMessage] КАК [REDTAILOrderCreationErrorMessage], [Проект1].[APIInviteData] КАК [APIInviteData], [Проект1].[CRN] КАК [CRN] ОТ ( ВЫБРАТЬ [Фильтр1].[ResultStatus] AS [ResultStatus], [Фильтр1].[Назначение] AS [Назначение], [Фильтр1].[Дата создания1] КАК [Дата создания], [Экстент3].[ID] КАК [ID], [Extent3].[TrackingIdentifier] КАК [TrackingIdentifier], [Extent3].[ClientTrackingIdentifier] AS [ClientTrackingIdentifier], [Extent3].[RequestorEmail] КАК [RequestorEmail], [Extent3].[CandidateEmail] КАК [CandidateEmail], [Extent3].[ConsumerIdentifier] AS [ConsumerIdentifier], [Extent3].[LocationIdentifier] AS [LocationIdentifier], [Extent3].[CandidateID] AS [CandidateID], [Экстент3].[TotalCount] КАК [TotalCount], [Extent3].[KitIdentifier] КАК [KitIdentifier], [Extent3].[QueryStatus] AS [QueryStatus], [Extent3].[QueryData] КАК [QueryData], [Экстент3].[Дата создания] КАК [Дата создания1], [Extent3].[CorporateEntityID] AS [CorporateEntityID], [Extent3].[Requestor_CaseID] AS [Requestor_CaseID], [Extent3].[CandidateSMS] КАК [CandidateSMS], [Extent3].[NotificationType] AS [NotificationType], [Extent3].[REDTAILOrderCreationStatus] КАК [REDTAILOrderCreationStatus], [Extent3].[REDTAILOrderCreationErrorMessage] КАК [REDTAILOrderCreationErrorMessage], [Extent3].[APIInviteData] КАК [APIInviteData], [Экстент3].[CRN] КАК [CRN], 1 АС [C1] ИЗ (ВЫБЕРИТЕ [Extent1].[IntakeDataID] КАК [IntakeDataID], [Extent1].[TrackingIdentifier] КАК [TrackingIdentifier1], [Extent1].[ResultStatus] КАК [ResultStatus], [Extent1].[Destination] КАК [Destination] , [Extent1].[CreatedDate] AS [CreatedDate1], [Extent2].[Requestor_CaseID] AS [Requestor_CaseID] ИЗ [dbo].[ResultData] КАК [Extent1] ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ [dbo].[IntakeData] AS [Extent2] ON [Extent1].[IntakeDataID] = [Extent2].[ID] ГДЕ (''RESPONSE'' = [Extent1].[ResponseType]) И ([Extent1].[ResponseType] НЕ NULL) И (''OK'' = [Extent1].[Status]) AND ([Extent1] .[Состояние] НЕ NULL) ) AS [Filter1] ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ [dbo].[IntakeData] AS [Extent3] ON [Filter1].[IntakeDataID] = [Extent3].[ID] ГДЕ ((([Filter1].[TrackingIdentifier1] = @p__linq__0) И ( NOT ([Filter1].[TrackingIdentifier1] IS NULL ИЛИ @p__linq__0 IS NULL))) ИЛИ (([Filter1].[TrackingIdentifier1] IS NULL) И (@p__linq__0 IS NULL)) ИЛИ (([Filter1].[Requestor_CaseID] = @p__linq__1) И ( NOT ([Filter1].[Requestor_CaseID] NULL ИЛИ @p__linq__1 IS NULL))) ИЛИ (([Filter1].[ Requestor_CaseID] IS NULL) И (@p__linq__1 IS NULL))) И ((([Filter1].[Destination] = @p__linq__2) AND ( NOT ([Filter1].[Destination] IS NULL ИЛИ @p__linq__2 IS NULL))) ИЛИ (([Фильтр1].[Назначение] — NULL) И (@p__linq__2 — NULL))) ) АС [Проект1] ORDER BY [Project1].[CreatedDate] DESC',N'@p__linq__0 varchar(8000),@p__linq__1 varchar(8000),@p__linq__2 varchar(8000)',@p__linq__0='06ONMJ99SN',@p__linq__1='06ONMJ99SN', @p__linq__2='АКЦИО' Любая помощь по упрощению сгенерированного SQL-запроса до меньшей хранимой процедуры будет принята с благодарностью. Я все еще изучаю SQL, поэтому буду благодарен за помощь.
Спасибо
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение