• 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作为首选关系数据库。

  • 相关阅读:
    【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例
    [Usaco2008 Dec]Patting Heads
    Hibernate(六)——多对多关联映射
    2017第2周一小程序
    2017第一周日
    2017第一周六
    无论你如何努力,总会有人讨厌你
    word使用技巧-批量删除图片技巧
    Web跨域问题总结
    JAVA语言的本质优势
  • 原文地址:https://www.cnblogs.com/william-xu/p/12421634.html
Copyright © 2020-2023  润新知