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);
}
相关推荐
怣50几秒前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx21 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星32 分钟前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发1 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐1 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly1 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客1 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.1 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐2 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99992 小时前
Redis-0-业务逻辑
数据库·redis·缓存