ABP将ExtraProperties作为查询条件

文章目录

背景

痛点

ABP使用ExtraProperties实现动态字段,它通常是以json文本的形式存在数据库里,如果将动态字段作为where条件去查,通常会调用json_value。即使这样在没有索引加持下也会很慢。

破局

简而言之就是postgresql里的gin+jsonb,但是无论是EF还是Dapper都不支持jsonb进行查询。(我试了不行,各位可以再试试)

sql 复制代码
select * from "Books" b where b."ExtraProperties"->>'出版社'='新华书店';
select * from "Books" b where b."ExtraProperties"->>'SomeTime' > '2025-12-31';

最终还是选择了SqlSugar

Coding

OnModelCreating

原则上我们还是要用EF Code First创建数据库的。但是要修改一下OnModelCreating

csharp 复制代码
builder.Entity<Book>(b =>
{
    b.ToTable("Books");

    //Configure the base properties
    b.ConfigureByConvention();

    //Configure other properties (if you are using the fluent API)
    b.Property(x => x.Name).IsRequired().HasMaxLength(128);
    b.Property(x => x.ExtraProperties).HasColumnType("jsonb")
        .HasConversion(
            v => JsonSerializer.Serialize(v),
            v => JsonSerializer.Deserialize<ExtraPropertyDictionary>(v)
         )
        .HasDefaultValueSql("'{}'::jsonb");
});

修改Book

为了让SqlSugar知道某个字段是json字段,还要给字段加IsJson标注,可以在entity上加,也可以在dto上加。具体取决于你用哪个类去接

csharp 复制代码
public class Book : FullAuditedAggregateRoot<Guid>
{
    public Book() { }
    public Book(Guid id) : base(id) { }
    public string Name { get; set; }
    [SugarColumn(IsJson = true)]
    public override ExtraPropertyDictionary ExtraProperties { get; protected set; }
}

创建API

csharp 复制代码
public virtual async Task<IActionResult> GetBook()
{
    var books = _sugarDb.Db.Ado.SqlQuery<Book>(@"select * from ""Books"" b where b.""ExtraProperties""->>'出版社'=@store;", 
                                                    new { store = "新华书店" }).ToList();
    //这样查询还是会报错
    //var books = _sugarDb.Db.Queryable<Book>().Where(b => SqlFunc.JsonField(b.ExtraProperties, "出版社") == "新华书店").ToList();
    return new JsonResult(books);
}
相关推荐
Hrain-AI4 小时前
多 Agent 并行不打架:worktree 隔离与反馈回流落地(附脚本)
网络·数据库·人工智能·架构
净水深流5 小时前
中央厨房冷链技术实践:多温区改造、WMS落地与IoT温控架构
大数据·数据库·人工智能·冷库冷链
l1t5 小时前
测试DuckDB 2.1的match_recognize模式匹配语句
数据库·duckdb
IpdataCloud6 小时前
AI智能体调用工具怎么核验来源IP?归属地、网络类型与代理风险识别(含Python代码)
数据库·python·tcp/ip
曹牧6 小时前
Java:SQL 注入漏洞
数据库
程序员JerrySUN7 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
oradh8 小时前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)
数据库·oracle
达梦数据8 小时前
DMDRS辅助表生成规则与作用
数据库·oracle
‎ദ്ദിᵔ.˛.ᵔ₎8 小时前
MySQL 表约束
数据库·mysql
Doris__HE8 小时前
【元脑服务器NF5476G7-NF5476M7技术规格分享】
运维·服务器·网络·数据库·性能优化