Сопоставить пользовательскую функцию значения базы данных в Entity Framework - PullRequest
1 голос
/ 27 сентября 2019

У меня есть простая функция базы данных, которая ожидает две строки в качестве параметра и возвращает строку.Я хочу сопоставить это с структурой сущности.Подобно этому вопросу , я создал простой заголовок функции:

[DbFunction("dbo", "StripCharacters")]
public static string StripCharacters(string input, string pattern = "^A-Z0-9") => throw new NotSupportedException();

Как и в связанном посте, я получаю то же сообщение об ошибке, как только я пытаюсь использовать этоМетод внутри одного из моих запросов.Сообщение об исключении:

Метод System.String StripCharacters(System.String, System.String) в типе DE.ZA.TrailerLoadingAssistant.Web.Models.DatabaseEntities не может быть преобразован в выражение хранилища LINQ to Entities

await mapi.db.TrailerAutocompleteHelpers
    .Where(t => t.SearchString.Contains(DatabaseEntities.StripCharacters(userInput, "^A-Z0-9")))
    .ToListAsync();

Вот функция базы данных:

CREATE FUNCTION [dbo].[StripCharacters]
(
    @String NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX) WITH SCHEMABINDING
AS
BEGIN
    SET @MatchExpression =  '%['+@MatchExpression+']%'

    WHILE PatIndex(@MatchExpression, @String) > 0
        SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')

    RETURN @String

END

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 27 сентября 2019

Я на самом деле сделал две ошибки.Во-первых, вы должны вручную добавить объявление функции в файл EDMX:

<Function Name="StripCharacters" ReturnType="nvarchar" Schema="dbo" >
  <Parameter Name="String" Mode="In" Type="nvarchar" />
  <Parameter Name="MatchExpression" Mode="In" Type="varchar" />
</Function>

Во-вторых, первый параметр атрибута DbFunction должен быть не именем схемы вашей базы данных, а Entity Framework.модель пространства имен.Это снова можно найти в файле EDMX:

<Schema Namespace="MyApplicationModel.Store" ...>

Правильный атрибут будет:

[DbFunction("MyApplicationModel.Store", "StripCharacters")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...