我正在尝试将 SQL Server 的内置 JSON 功能与 Entity Framework Core 6 结合使用。它实际上与 JSON_VALUE 配合得非常好,如下所示。var results = _context.Pages.Whe...
我正在尝试将 SQL Server 的内置 JSON 功能与 Entity Framework Core 6 结合使用。它实际上与 JSON_VALUE 配合得非常好,如下所示。
var results = _context.Pages.Where(p => MyDbFunctions.JsonValue(p._PublishedContent, "$.content").ToLower().Contains("test"));
DbContext如下:
public class JsonValueTestingContext : DbContext
{
public JsonValueTestingContext(DbContextOptions context) : base(context) { }
public DbSet<Page> Pages { get; set; }
public DbSet<Template> Templates { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDbFunction(() => MyDbFunctions.JsonValue(default(string), default(string)));
modelBuilder.HasDbFunction(() => MyDbFunctions.JsonQuery(default(string), default(string)));
}
}
public static class MyDbFunctions
{
[DbFunction("JSON_VALUE", Schema = "", IsBuiltIn = true)]
public static string JsonValue(string source, [NotParameterized] string path) => throw new NotSupportedException();
[DbFunction("JSON_QUERY", Schema = "", IsBuiltIn = true)]
public static string JsonQuery(string source, [NotParameterized] string path) => throw new NotSupportedException();
}
我遇到的挑战是 JSON_VALUE 适用于字符串、整数、布尔值、日期时间等基本类型。但是,我也存储了一串数组,如 ['Apple', 'Orange', 'Pear'],我非常想做类似以下的事情:
var results = _context.Pages.Where(p => MyDbFunctions.JsonQuery(p._PublishedContent, "$.content").Contains("Apple"));
我似乎无法弄清楚如何实现后者。如果我尝试在 MyDbFunctions 中为 JSON_QUERY 返回 string[] 类型,它会说这是提供程序的无效返回类型。我也尝试了各种转换,但 Linq 无法转换。我觉得一定有办法。