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);
}
相关推荐
supericeice12 小时前
创邻科技 Galaxybase Graph Intelligence 图智能平台:一站式可视化图数据存储、图计算与图挖掘平台
数据库·科技
heimeiyingwang12 小时前
【架构实战】NewSQL数据库对比(TiDB/CockroachDB)
数据库·架构·tidb
buhuimaren_12 小时前
pg日常维护
数据库·oracle
大虾别跑12 小时前
Oracle迁移
数据库·oracle
Trouvaille ~12 小时前
【MySQL篇】数据库操作:从创建到管理
linux·数据库·mysql·oracle·xshell·ddl
瀚高PG实验室13 小时前
ETL中,分区表子表未及时收集统计信息,导致sql执行耗时很长
数据库·数据仓库·sql·etl·瀚高数据库
LDG_AGI13 小时前
【搜索引擎】Elasticsearch(二):基于function_score的搜索排序
数据库·人工智能·深度学习·elasticsearch·机器学习·搜索引擎·推荐算法
枫叶林FYL13 小时前
【自然语言处理 NLP】7.2.2.4 去偏见技术与公平性优化
数据库
星川水月13 小时前
SQL 开窗函数排序详解
数据库·sql
荒川之神13 小时前
Oracle 数据仓库雪花模型设计原则(核心 + 落地 + Oracle 数据库适配)
数据库·数据仓库·oracle