在实体框架地图自定义数据库值函数(Map custom database value functio

2019-09-28 19:37发布

我有一个简单的数据库功能,预计两个字符串作为参数,并返回一个字符串。 我想与实体框架图本。 类似这样的问题 ,我创建了一个简单的函数头:

[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实体储存表达

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

我怎么解决这个问题?

Answer 1:

其实,我犯了两个错误。 首先,你必须手动添加函数声明你的EDMX文件:

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

其次,第一个参数DbFunction属性不能是你的数据库的架构名称,但实体框架模型命名空间。 这可以再次EDMX文件中找到:

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

正确的属性是:

[DbFunction("MyApplicationModel.Store", "StripCharacters")]


文章来源: Map custom database value function in Entity Framework