在实体框架中映射自定义数据库值功能

时间:2019-09-27 12:56:38

标签: c# entity-framework-6

我有一个简单的数据库函数,该函数需要两个字符串作为参数并返回一个字符串。我想将此映射到实体框架。与this question类似,我创建了一个简单的函数标头:

[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 个答案:

答案 0 :(得分:1)

我实际上犯了两个错误。首先,您必须手动将函数声明添加到EDMX文件中:

interface Params {
 param1: string
 param2: string
 param3: string
 param4: string
 paramN: string
}

const funct = (params: Partial<Params>) => {
...
}

第二,<Function Name="StripCharacters" ReturnType="nvarchar" Schema="dbo" > <Parameter Name="String" Mode="In" Type="nvarchar" /> <Parameter Name="MatchExpression" Mode="In" Type="varchar" /> </Function> 属性的第一个参数必须不是数据库的架构名称,而是实体框架模型名称空间。可以再次在EDMX文件中找到它:

DbFunction

正确的属性是:

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