From 74674edc4dd314d0e347fb0b8a34720bdb159913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=81=A5?= <139939967@qq.com> Date: Tue, 21 May 2024 11:14:21 +0800 Subject: [PATCH] feat: support sqlite json index and change for jsonfield method --- .../SqlBuilder/SqliteExpressionContext.cs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs index 0cf063356..0bb7339d0 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs @@ -4,8 +4,9 @@ namespace SqlSugar { public class SqliteExpressionContext : ExpressionContext, ILambdaExpressions { - public override ExpressionContextCase Case { get; set; } = new ExpressionContextCase() { - IsDateString= true, + public override ExpressionContextCase Case { get; set; } = new ExpressionContextCase() + { + IsDateString = true, }; public SqlSugarProvider Context { get; set; } public SqliteExpressionContext() @@ -24,17 +25,27 @@ namespace SqlSugar } public override string Equals(MethodCallExpressionModel model) { - var result= base.Equals(model); - if (model.Args.Count == 3&& result.Trim().Last()==')') + var result = base.Equals(model); + if (model.Args.Count == 3 && result.Trim().Last() == ')') { - result = (" "+result.Trim().TrimEnd(')') + " COLLATE NOCASE ) "); + result = (" " + result.Trim().TrimEnd(')') + " COLLATE NOCASE ) "); } return result; } + public override string JsonIndex(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter1 = model.Args[1]; + return $"json_extract({parameter.MemberName}, '$[{parameter1.MemberValue}]')"; + } public override string JsonField(MethodCallExpressionModel model) { - model.Parameters.RemoveAll(item=>item.ParameterName== model.Args[1].MemberName+""); - return " json_extract("+ model.Args[0].MemberName + ",'$." + model.Args[1].MemberValue + "') "; + var hasPrefix = model.Args[1].MemberValue is string v ? v[0] == '$' : false; + model.Parameters.RemoveAll(item => item.ParameterName == model.Args[1].MemberName + ""); + return string.Format("json_extract({0},'{1}{2}')", + model.Args[0].MemberName, + hasPrefix ? string.Empty : string.Intern("$."), + model.Args[1].MemberValue); } public override string GetStringJoinSelector(string result, string separator) { @@ -262,7 +273,7 @@ namespace SqlSugar public override string MergeString(params string[] strings) { - return string.Join("||", strings).Replace("+",""); + return string.Join("||", strings).Replace("+", ""); } public override string IsNull(MethodCallExpressionModel model) @@ -308,7 +319,7 @@ namespace SqlSugar var parameterNameA = mode.Args[0].MemberName; var parameterNameB = mode.Args[1].MemberName; var parameterNameC = mode.Args[2].MemberName; - var value = new string[mode.Args[1].MemberValue.ObjToInt()].Select(it=> parameterNameC); + var value = new string[mode.Args[1].MemberValue.ObjToInt()].Select(it => parameterNameC); return $"substr({string.Join("||", value)} || {parameterNameA}, {parameterNameB}*-1) "; }