From d05f3456d06374e4d394c435ce636b275f9b5237 Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Sat, 25 Dec 2021 20:25:44 +0800 Subject: [PATCH] Add Where(ConditionalTree) --- .../SqlBuilderProvider/SqlBuilderProvider.cs | 58 ++++++++++++++++++- .../SqlSugar/Entities/ConditionalModel.cs | 5 +- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs index 3c71ff0fb..4d832a6d1 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs @@ -123,11 +123,17 @@ namespace SqlSugar List parameters = new List(); var sqlBuilder = InstanceFactory.GetSqlbuilder(this.Context.CurrentConnectionConfig); var mainIndex = 0; + var indexTree = 0; foreach (var model in models) { if (model is ConditionalModel) { var item = model as ConditionalModel; + if (item.FieldName == $"[value=sql{UtilConstants.ReplaceKey}]") + { + builder.Append(item.FieldValue); + continue; + } var index = mainIndex + beginIndex; var type = index == 0 ? "" : "AND"; if (beginIndex > 0) @@ -252,7 +258,7 @@ namespace SqlSugar } item.FieldName = oldName; } - else + else if (model is ConditionalCollections) { var item = model as ConditionalCollections; if (item != null && item.ConditionalList.HasValue()) @@ -292,11 +298,61 @@ namespace SqlSugar } } } + else + { + var item = model as ConditionalTree; + BuilderTree(builder,item,ref indexTree, parameters); + } mainIndex++; } return new KeyValuePair(builder.ToString(), parameters.ToArray()); } + private void BuilderTree(StringBuilder builder,ConditionalTree item,ref int indexTree, List parameters) + { + var conditionals = ToConditionalCollections(item,ref indexTree, parameters); + var sqlobj = ConditionalModelToSql(new List { conditionals }, 1); + var sql = sqlobj.Key; + RepairReplicationParameters(ref sql, sqlobj.Value,indexTree); + parameters.AddRange(sqlobj.Value); + var buiderSql = sql; + builder.Append(buiderSql); + indexTree++; + } + + private ConditionalCollections ToConditionalCollections(ConditionalTree item,ref int indexTree, List parameters) + { + List> list = new List>(); + foreach (var it in item.ConditionalList) + { + ConditionalModel model = new ConditionalModel(); + if (it.Value is ConditionalModel) + { + model = (ConditionalModel)it.Value; + } + else + { + var con = ToConditionalCollections(it.Value as ConditionalTree,ref indexTree, parameters); + var sqlobj = ConditionalModelToSql(new List { con },0); + var sql = sqlobj.Key; + RepairReplicationParameters(ref sql, sqlobj.Value, indexTree); + model = new ConditionalModel() + { + FieldName = $"[value=sql{UtilConstants.ReplaceKey}]", + FieldValue = sql + }; + parameters.AddRange(sqlobj.Value); + indexTree++; + } + list.Add(new KeyValuePair(it.Key, model)); + } + var result= new ConditionalCollections() + { + ConditionalList = list + }; + return result; + } + private static object GetFieldValue(ConditionalModel item) { if (item.FieldValueConvertFunc != null) diff --git a/Src/Asp.Net/SqlSugar/Entities/ConditionalModel.cs b/Src/Asp.Net/SqlSugar/Entities/ConditionalModel.cs index a22490d40..5d7a48187 100644 --- a/Src/Asp.Net/SqlSugar/Entities/ConditionalModel.cs +++ b/Src/Asp.Net/SqlSugar/Entities/ConditionalModel.cs @@ -12,7 +12,10 @@ namespace SqlSugar { public List> ConditionalList { get; set; } } - + public class ConditionalTree : IConditionalModel + { + public List> ConditionalList { get; set; } + } public class ConditionalModel: IConditionalModel { public ConditionalModel()