Вызов хранимых процедур из Entity Framework Core 3.0 - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть несколько хранимых процедур, которые имеют ряд параметров и выполняют сложный оператор выбора, где результаты точно соответствуют таблице или представлению. Я хотел бы сопоставить набор результатов с сущностями. Это работало нормально с версией 2.2, но я не могу заставить его работать с EFCore 3.0.

Мой код такой:

SqlParameter regionId = p.RegionId.HasValue && p.RegionId.Value != 0 ? new SqlParameter( "@RegionId", p.RegionId.Value ) : new SqlParameter( "@RegionId", System.DBNull.Value );

… (other parameters omitted for clarity, but all SqlParameters)

var contacts = await _context.PersonSearchViewSearch.FromSqlRaw( "EXECUTE [dbo].[PersonSearchView_Search] @RegionId, @RecordId, @Surname, @Firstname, @PostCode, @HomePhone, @WorkPhone, @MobilePhone, @EMail, @IncludePatients, @IncludeContacts, @IncludeEnquiries, @AllowedRegions, @IncludeOtherRegions, @IncludeDisallowedRegions, @FirstNameMP, @FirstNameAltMP, @SurnameMP, @SurnameAltMP", regionId, id, surname, forename, postcode, homePhone, workPhone, mobilePhone, email,includePatients, includeContacts, includeEnquiries, allowedRegions, includeOtherRegions,includeDisallowedRegions, forenameMP, forenameAltMP, surnameMP, surnameAltMP ).ToListAsync();

В EF Core 3.0 это генерирует следующий SQL (которыйнедопустимо):

exec sp_executesql N'SELECT [p].[Address1], [p].[Address2], [p].[Address3], [p].[Address4], [p].[CarerOrProfessionalId], [p].[City], [p].[ContactId], [p].[Discriminator], [p].[EMail], [p].[EnquiryId], [p].[FirstName], [p].[FirstNameAltMP], [p].[FirstNameMP], [p].[HomePhone], [p].[MobilePhone], [p].[PatientId], [p].[PostCode], [p].[PreferredPhone], [p].[PreferredPhoneNo], [p].[RegionId], [p].[RegionName], [p].[SalutationId], [p].[SearchId], [p].[Surname], [p].[SurnameAltMP], [p].[SurnameMP], [p].[Title], [p].[WorkPhone], [p].[IsAllowed], [p].[IsPrimaryRegion]
FROM (
    EXECUTE PersonSearchView_Search @RegionId,@RecordId,@Surname,@Firstname,@PostCode,@HomePhone,@WorkPhone,@MobilePhone,@EMail,@IncludePatients,@IncludeContacts,@IncludeEnquiries,@AllowedRegions,@IncludeOtherRegions,@IncludeDisallowedRegions,@FirstNameMP,@FirstNameAltMP,@SurnameMP,@SurnameAltMP
) AS [p]
WHERE [p].[Discriminator] = N''PersonSearchViewSearch''',N'@RegionId int,@RecordId nvarchar(4000),@Surname nvarchar(6),@Firstname nvarchar(4000),@PostCode nvarchar(4000),@HomePhone nvarchar(4000),@WorkPhone nvarchar(4000),@MobilePhone nvarchar(4000),@EMail nvarchar(4000),@IncludePatients bit,@IncludeContacts bit,@IncludeEnquiries bit,@AllowedRegions nvarchar(8),@IncludeOtherRegions bit,@IncludeDisallowedRegions bit,@FirstNameMP nvarchar(4000),@FirstNameAltMP nvarchar(4000),@SurnameMP nvarchar(3),@SurnameAltMP nvarchar(3)',@RegionId=1,@RecordId=NULL,@Surname=N'smith%',@Firstname=NULL,@PostCode=NULL,@HomePhone=NULL,@WorkPhone=NULL,@MobilePhone=NULL,@EMail=NULL,@IncludePatients=1,@IncludeContacts=1,@IncludeEnquiries=1,@AllowedRegions=N'1,2,6,11',@IncludeOtherRegions=0,@IncludeDisallowedRegions=0,@FirstNameMP=NULL,@FirstNameAltMP=NULL,@SurnameMP=N'SM0',@SurnameAltMP=N'XMT'

Хранимые процедуры слишком сложны, чтобы пытаться писать с Linq для SQL.

Единственный обходной путь, который у меня сейчас есть, - вернуться к SqlCommand/ SqlDataReader, но это требует написания большого количества дополнительного кода для отображения результатов обратно в сущность.

Есть ли лучший способ сделать это в EF Core 3.0?

1 Ответ

0 голосов
/ 06 ноября 2019

Для всех, кто сталкивался с этой проблемой, я отследил ее до определения «PersonSearchViewSearch» как производного класса от другого представления. Я изменил определение на автономный класс, скопировав все поля из базового класса, и это решило проблему.

Это изменило сгенерированный SQL как простой оператор Execute, а не как Select from Execute.

(EF Core 2.2 был доволен мной, используя производный класс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...