Mysql已经原生支持json,有5年多了。但我还没有用过,搜了一圈,MySql本身的语法还是很好写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g > FROM jemp > WHERE JSON_EXTRACT(c, "$.id") > 1 > ORDER BY JSON_EXTRACT(c, "$.name"); +-------------------------------+-----------+------+ | c | c->"$.id" | g | +-------------------------------+-----------+------+ | {"id": "3", "name": "Barney"} | "3" | 3 | | {"id": "4", "name": "Betty"} | "4" | 4 | | {"id": "2", "name": "Wilma"} | "2" | 2 | +-------------------------------+-----------+------+ 3 rows in set (0.00 sec) mysql> SELECT c, c->"$.id", g > FROM jemp > WHERE c->"$.id" > 1 > ORDER BY c->"$.name"; +-------------------------------+-----------+------+ | c | c->"$.id" | g | +-------------------------------+-----------+------+ | {"id": "3", "name": "Barney"} | "3" | 3 | | {"id": "4", "name": "Betty"} | "4" | 4 | | {"id": "2", "name": "Wilma"} | "2" | 2 | +-------------------------------+-----------+------+ 3 rows in set (0.00 sec) |
但是有些语言偏偏搞了很复杂的封装,比如C#。我做过的项目,主要用Pomelo库来连接MySql。而Pomelo库曾经做了一套JsonObject
的方案来使用MySql的json,后来又弃用了。但是网上大量留下了JsonObject
的教程,这是多么尴尬的局面。最尴尬的是Pomelo库本身并没有编写完整的文档,所以能搜到的信息,基本都是误导信息。经过一番探索,我总结一下目前正统的方案。
方案开始
首先安装必要的库,我这里使用的是Microsoft的Json序列化方案,因为它支持递归引用的序列化,所以更推荐用它来做序列化。
1 2 3 4 |
dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.10 dotnet add package Microsoft.EntityFrameworkCore.Relational --version 3.1.10 dotnet add package Pomelo.EntityFrameworkCore.MySql --version 3.2.4 dotnet add package Pomelo.EntityFrameworkCore.MySql.Json.Microsoft --version 3.2.4 |
经过验证,以下代码是无意义的,并且可能导致运行时异常。
然后需要在Startup.cs
中的ConfigureServices
,添加以下代码
1 |
//services.AddEntityFrameworkMySqlJsonMicrosoft(); |
完整示例
1 2 3 4 5 6 7 8 9 10 11 |
public void ConfigureServices(IServiceCollection services) { var conn = Configuration.GetConnectionString("Mysql"); Console.WriteLine(conn); services.AddDbContext<piContext>(options => options.UseMySql(conn, x => x.ServerVersion("5.7.26-mysql"))); //services.AddEntityFrameworkMySqlJsonMicrosoft(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddControllers() .AddNewtonsoftJson(); } |
最后,在需要使用json查询的位置,使用
1 2 |
var id = 1; var result = dbContext.JsonTable.Where(o => EF.Functions.JsonExtract<int>(o.Json, "$.id") == id); |
就能生成这样的Sql代码
1 |
select * from JsonTable where JSON_EXTRACT(Json, "$.id") = 1; |