gpt4 book ai didi

c# - EF Core 5 - 如何将 EF.Functions.Like 与映射到 JSON 字符串的自定义属性一起使用?

转载 作者:行者123 更新时间:2023-12-05 01:28:58 25 4
gpt4 key购买 nike

在我的一个数据库模型中,我有一个具有自定义类型 ( Dictionary<string, string> ) 的属性,它会使用自定义转换器自动转换为 JSON 或从 JSON 转换,并存储为 text。数据库中的字段。我希望能够使用 MySQL 的 LIKE比较器在此 JSON 字段中搜索字符串,但出现异常。我不关心 JSON 的结构,我可以将其视为一个简单的文本字段并以这种方式进行搜索。

以下是我尝试执行此操作的方法(Sku 是复杂类型):

var responseSet = database.Products.Where(p => EF.Functions.Like(p.Sku, "%query%"));

这是我得到的异常:

An unhandled exception has occurred while executing the request.
System.InvalidOperationException: The LINQ expression 'DbSet<ProductObject>()
.Where(p => __Functions_0
.Like(
matchExpression: p.Sku, pattern: __Format_1))' could not be translated.
Additional information:
Translation of method 'Microsoft.EntityFrameworkCore.MySqlDbFunctionsExtensions.Like'
failed. If this method can be mapped to your custom function,
see https://go.microsoft.com/fwlink/?linkid=2132413 for more information.

异常中的链接指向一个带有大量交叉引用的长 git 问题,但我无法在其中找到任何有用的信息。

有什么方法可以防止此错误发生并在复杂字段中进行搜索?

最佳答案

EF Core 的根本问题 value converters是 LINQ 查询是针对客户端类型构建的,然后在幕后转换为提供程序类型,并且没有标准方法在查询中指定提供程序类型转换。

但是有一个简单的转换技巧(在我对其他转换相关问题的一些回答中提出,例如 How can a JSON_VALUE be converted to a DateTime with EF Core 2.2?Expression tree to SQL with EF CoreComparing strings as dates using EF core 3),它适用于大多数 EF Core 关系数据库提供程序。

在这种情况下,您知道提供程序类型的 CLR 等效项是 string,因此您可以使用以下转换

p => EF.Functions.Like((string)(object)p.Sku, "%query%")

object 的中间转换是为了让 C# 编译器接受实际的转换。 EF Core 翻译器足够聪明,可以删除它(以及其他不需要的,就像这里一样)。

关于c# - EF Core 5 - 如何将 EF.Functions.Like 与映射到 JSON 字符串的自定义属性一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68125116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com