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);
}
相关推荐
子非鱼a2 小时前
【WEB】[BJDCTF2020]Easy MD5
数据库
APItesterCris2 小时前
告别人工盯品:借助 OpenClaw 搭建商品自动监控与数据分析系统(完整实操)
大数据·数据库·数据仓库·自动化
zcn1262 小时前
exists子查询改写思考
数据库·sql·sql优化改写
betazhou2 小时前
mysql shell8.4.10+mysql 8.4.10搭建MySQL replicaset主从
数据库·mysql·ffmpeg·replicaset·mysql shell
zcmodeltech3 小时前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造
Elastic 中国社区官方博客3 小时前
从建议到修复的 4 个阶段:使用 Elastic Workflows 实现人在回路中的自动化
运维·数据库·人工智能·后端·elasticsearch·ai·自动化
北京靠谱的GEO优化机构3 小时前
海外推广:没有媒体内容,SEO就是“无米之炊“
服务器·数据库·媒体
2601_962071573 小时前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库
circuitsosk3 小时前
从零搭建行业知识平台:向量库+图数据库+传统关系库的多模检索统一层设计
数据库·python·oracle·向量数据库·rag·多模检索
程序员夏洛3 小时前
Redis 中如何实现分布式锁?
数据库·redis·分布式