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作為首選關系數據庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM