EF Core查询jsonb

Posted 一曲肝腸斷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF Core查询jsonb相关的知识,希望对你有一定的参考价值。

简介

JSON(javascript Object Notation)在web开发和跨应用领域有着绝对的优势,甚至Monodb、Redis数据库完全采用json存储。PostgreSQL很早就已经全支持JSON类型的存储和查询,为了更大的提高JSON查询效率PostgreSQL提供了jsonb类型用来存储JSON,目前jsonb的结构化sql查询已经十分强大,但是对于许多web开发者来说写sql已经成为过去式,我们更多的会使用linq或lambda来实现OOP中的对象查询。本篇就给大家介绍在EF Core中查询jsonb。

引用和依赖

在项目中引用Npgsql.EntityFrameworkCore.PostgreSql最新包 --- Npgsql在查询时会生成postgreSQL语法。

实体和数据

创建JsonbEntity实体如下:

    public class JsonbEntity
    {
        public Int Id { get; set; }
        public JsonElement Customer { get; set; }
    }

EF Core Mapping映射配置如下:

    builder.Entity<JsonbEntity>(b =>
    {
        b.ToTable("jsonb");

        b.Property(x => x.Customer).HasColumnType("jsonb");
    });

Code First迁移到数据库
PM> Add-Migration
PM> Update-Database

手动添加一条json到Customer:

{"Age": 25, "Name": "Joe", "Orders": [{"Price": 9, "ShippingAddress": "Some address 1"}, {"Price": 23, "ShippingAddress": "Some address 2"}]}

查询

查询jsonb表中第一条数据Customer字段中第一个Order的价格:

仓储方式查询:

    var jsonb = _repository.First();
    Console.WriteLine(jsonb.Customer.GetProperty("Orders")[0].GetProperty("Price").GetInt32());
    

DbContext方式查询:

    var json= _dbContext.JsonbEntity.First().Customer.GetProperty("Orders")[0].GetProperty("Price").GetInt32();
    Console.WriteLine(json);

查询结果:
技术图片

接下来查询List
jsonb表中再次手动添加一条数据:

{"Age": 27, "Name": "Joe", "Orders": [{"Price": 6, "ShippingAddress": "Some address 1"}, {"Price": 20, "ShippingAddress": "Some address 2"}]}

lambda方式查询:

var jsonb = _repository.Where(_ => _.Customer.GetProperty("Name").GetString() == "Joe").ToList();

查询结果:
技术图片

EF Core生成的Sql:

SELECT j."Id", j."Customer"
FROM jsonb AS j
WHERE j."Customer"->>'Name' = 'Joe'

可以看出EF Core是通过PostgreSql的jsonb语法进行查询的。

总结

PostgreSQL是一个功能齐全且十分强大的开源关系数据库,除了jsonb外其分表分库功能也是十分强大的,相信未来会有更多的企业和项目会将PostgreSQL作为首选关系数据库。

以上是关于EF Core查询jsonb的主要内容,如果未能解决你的问题,请参考以下文章

实现 EF Core 6 自定义查询标记

EF Core 中的查询超时,但在 SSMS 中运行速度很快

EF Core 3 - 不必要的 ORDER BY 减慢查询

EF Core 基础知识

LINQ 实体框架查询在 EF Core 中不起作用,引发异常

Dotnet EF Core 2.1 在查询小数属性时抛出 QueryClientEvaluationWarning