使用SqlSugar查询带有json字符串表的查询方式

使用 SqlSugar 查询带有 json 字符串表的查询方式

方式一:Where 中使用原生 SQL 片段(推荐、最直接)
1
2
3
var list = db.Queryable<tablemodel>()
.Where("jsonresult->>'$.P11' = @p", new SugarParameter("@p", "张三"))
.ToList();
方式二:WhereIF / 动态拼接场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static class SqlSugarExtension
{
public static ISugarQueryable<T> WhereIfSql<T>(
this ISugarQueryable<T> query,
bool condition,
string whereSql,
params SugarParameter[] parameters)
{
return condition ? query.Where(whereSql, parameters) : query;
}
}

var name = "张三";
var list = db.Queryable<tablemodel>()
.WhereIF(!string.IsNullOrEmpty(name),
"jsonresult->>'$.P11' = @p", new SugarParameter("@p", name))
.ToList();
方式三:使用 SqlFunc.MappingColumn 映射为表达式(适合在 Lambda 中混用)
1
2
3
var list = db.Queryable<LabourRecordXx>()
.Where(it => SqlFunc.MappingColumn(it.Jsonresult, "jsonresult->>'$.P11'") == "张三")
.ToList();
方式四:如果需要更复杂的 JSON 查询,可以用 JSON_EXTRACT 函数
1
2
3
4
var list = db.Queryable<LabourRecordXx>()
.Where("JSON_UNQUOTE(JSON_EXTRACT(jsonresult, '$.P11')) = @p",
new SugarParameter("@p", "张三"))
.ToList();
说明:
MySQL 的 ->>‘.P11' 本质上是 JSON_UNQUOTE(JSON_EXTRACT(jsonresult, '.P11’)) 的语法糖,两者等价。
方式一最简洁,适合大多数场景,SQL 片段会直接拼入生成的 SQL。
方式三的 MappingColumn 适合需要在 Lambda 表达式树中混合使用原生 SQL 片段的场景,但写法不太直观。
如果 jsonresult 字段类型在实体中是 string,以上方式都可以正常工作;如果是强类型对象,则方式一/二/四更合适。
始终使用参数化查询(SugarParameter),避免 SQL 注入。