diff --git a/OrmTest/OrmTest.csproj b/OrmTest/OrmTest.csproj index e6cfed6d4..f163b2ed9 100644 --- a/OrmTest/OrmTest.csproj +++ b/OrmTest/OrmTest.csproj @@ -61,9 +61,10 @@ - + + diff --git a/OrmTest/UnitTest/Delete.cs b/OrmTest/UnitTest/Delete.cs index f925bd9ed..aee3b5364 100644 --- a/OrmTest/UnitTest/Delete.cs +++ b/OrmTest/UnitTest/Delete.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace OrmTest { - public class Delete : ExpTestBase + public class Delete : UnitTestBase { private Delete() { } public Delete(int eachCount) diff --git a/OrmTest/UnitTest/ExpressionTest/Field.cs b/OrmTest/UnitTest/ExpressionTest/Field.cs index 8e5404ca4..583a00319 100644 --- a/OrmTest/UnitTest/ExpressionTest/Field.cs +++ b/OrmTest/UnitTest/ExpressionTest/Field.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Field : ExpTestBase + public class Field : UnitTestBase { private Field() { } public Field(int eachCount) diff --git a/OrmTest/UnitTest/ExpressionTest/Method.cs b/OrmTest/UnitTest/ExpressionTest/Method.cs index 896bfabd3..0e180527d 100644 --- a/OrmTest/UnitTest/ExpressionTest/Method.cs +++ b/OrmTest/UnitTest/ExpressionTest/Method.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Method : ExpTestBase + public class Method : UnitTestBase { private Method() { } public Method(int eachCount) diff --git a/OrmTest/UnitTest/ExpressionTest/Select.cs b/OrmTest/UnitTest/ExpressionTest/Select.cs index 1c3c6816a..4686721ce 100644 --- a/OrmTest/UnitTest/ExpressionTest/Select.cs +++ b/OrmTest/UnitTest/ExpressionTest/Select.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Select : ExpTestBase + public class Select : UnitTestBase { private Select() { } public Select(int eachCount) diff --git a/OrmTest/UnitTest/ExpressionTest/Where.cs b/OrmTest/UnitTest/ExpressionTest/Where.cs index adcbe9396..d842deadb 100644 --- a/OrmTest/UnitTest/ExpressionTest/Where.cs +++ b/OrmTest/UnitTest/ExpressionTest/Where.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Where : ExpTestBase + public class Where : UnitTestBase { private Where() { } public Where(int eachCount) diff --git a/OrmTest/UnitTest/Insert.cs b/OrmTest/UnitTest/Insert.cs index 5f11ca04b..98f283296 100644 --- a/OrmTest/UnitTest/Insert.cs +++ b/OrmTest/UnitTest/Insert.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Insert : ExpTestBase + public class Insert : UnitTestBase { private Insert() { } public Insert(int eachCount) @@ -19,34 +19,40 @@ namespace OrmTest.UnitTest public void Init() { var db = GetInstance(); var insertObj = new Student() { Name="jack",CreateTime=DateTime.Now }; - var insertObjs = new List() { insertObj }.ToArray(); db.IgnoreColumns.Add("TestId", "Student"); //db.MappingColumns.Add("id","dbid", "Student"); - var s1= db.Insertable(insertObj).ToSql(); + var s1= db.Insertable(insertObj).ToSql(); //Insert reutrn Command Count - var s2=db.Insertable(insertObj).ExecuteCommand(); + var s2=db.Insertable(insertObj).ExecuteCommand(); db.IgnoreColumns = null; //Only insert Name - var s3 = db.Insertable(insertObj).InsertColumns(it => new {it.Name}).ToSql(); + var s3 = db.Insertable(insertObj).InsertColumns(it => new {it.Name}).ToSql(); //Ignore Name and TestId - var s4=db.Insertable(insertObj).IgnoreColumns(it => new{ it.Name,it.TestId }).ToSql(); + var s4=db.Insertable(insertObj).IgnoreColumns(it => new{ it.Name,it.TestId }).ToSql(); //Ignore Name and TestId - var s5 = db.Insertable(insertObj).IgnoreColumns(it => it == "Name" || it == "TestId").With(SqlWith.UpdLock).ToSql(); + var s5 = db.Insertable(insertObj).IgnoreColumns(it => it == "Name" || it == "TestId").With(SqlWith.UpdLock).ToSql(); //Use Lock - var s6 =db.Insertable(insertObj).With(SqlWith.UpdLock).ToSql(); + var s6 =db.Insertable(insertObj).With(SqlWith.UpdLock).ToSql(); //ToSql - var s7= db.Insertable(insertObj).With(SqlWith.UpdLock) + var s7= db.Insertable(insertObj).With(SqlWith.UpdLock) .InsertColumns(it => new { it.Name }).ToSql(); + db.IgnoreColumns = new IgnoreComumnList(); + db.IgnoreColumns.Add("TestId", "Student"); //Insert List - var s8= db.Insertable(insertObjs).With(SqlWith.UpdLock).ToSql(); + var insertObjs = new List(); + for (int i = 0; i < 1000; i++) + { + insertObjs.Add(new Student() { Name="name"+i }); + } + var s8= db.Insertable(insertObjs.ToArray()).InsertColumns(it=>new{ it.Name}).With(SqlWith.UpdLock).ToSql(); } public SqlSugarClient GetInstance() diff --git a/OrmTest/UnitTest/Mapping .cs b/OrmTest/UnitTest/Mapping .cs new file mode 100644 index 000000000..7db4d6ef4 --- /dev/null +++ b/OrmTest/UnitTest/Mapping .cs @@ -0,0 +1,31 @@ +using OrmTest.Models; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest.UnitTest +{ + public class Mapping:UnitTestBase + { + private Mapping() { } + public Mapping(int eachCount) + { + this.Count = eachCount; + } + + public void Init() { + + var db = GetInstance(); + var s1= db.Queryable().ToSql(); + } + + public SqlSugarClient GetInstance() + { + SqlSugarClient db = new SqlSugarClient(new AttrbuitesCofnig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true, EntityNamespace= "OrmTest.Models" }); + return db; + } + } +} diff --git a/OrmTest/UnitTest/Query/JoinQuery.cs b/OrmTest/UnitTest/Query/JoinQuery.cs index 20a71cd50..f17a440e5 100644 --- a/OrmTest/UnitTest/Query/JoinQuery.cs +++ b/OrmTest/UnitTest/Query/JoinQuery.cs @@ -8,7 +8,7 @@ using System.Linq.Expressions; using OrmTest.Models; namespace OrmTest.UnitTest { - public class JoinQuery : ExpTestBase + public class JoinQuery : UnitTestBase { private JoinQuery() { } public JoinQuery(int eachCount) diff --git a/OrmTest/UnitTest/Query/SelectQuery.cs b/OrmTest/UnitTest/Query/SelectQuery.cs index b080fee42..085769ad5 100644 --- a/OrmTest/UnitTest/Query/SelectQuery.cs +++ b/OrmTest/UnitTest/Query/SelectQuery.cs @@ -8,7 +8,7 @@ using System.Linq.Expressions; using OrmTest.Models; namespace OrmTest.UnitTest { - public class SelectQuery : ExpTestBase + public class SelectQuery : UnitTestBase { private SelectQuery() { } public SelectQuery(int eachCount) diff --git a/OrmTest/UnitTest/Query/SingleQuery.cs b/OrmTest/UnitTest/Query/SingleQuery.cs index efc1162fc..844c7943f 100644 --- a/OrmTest/UnitTest/Query/SingleQuery.cs +++ b/OrmTest/UnitTest/Query/SingleQuery.cs @@ -8,7 +8,7 @@ using System.Linq.Expressions; using OrmTest.Models; namespace OrmTest.UnitTest { - public class SingleQuery : ExpTestBase + public class SingleQuery : UnitTestBase { private SingleQuery() { } public SingleQuery(int eachCount) diff --git a/OrmTest/UnitTest/Setting/Attribute.cs b/OrmTest/UnitTest/Setting/Attribute.cs index a57a7f56b..e0e8da931 100644 --- a/OrmTest/UnitTest/Setting/Attribute.cs +++ b/OrmTest/UnitTest/Setting/Attribute.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class Attribute : ExpTestBase + public class Attribute : UnitTestBase { public Attribute(int eachCount) { diff --git a/OrmTest/UnitTest/Setting/AutoClose.cs b/OrmTest/UnitTest/Setting/AutoClose.cs index 55dabc6c0..738fe3aca 100644 --- a/OrmTest/UnitTest/Setting/AutoClose.cs +++ b/OrmTest/UnitTest/Setting/AutoClose.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class AutoClose : ExpTestBase + public class AutoClose : UnitTestBase { public AutoClose(int eachCount) { diff --git a/OrmTest/UnitTest/Setting/MapColumn.cs b/OrmTest/UnitTest/Setting/MapColumn.cs index 9ed1b4f51..5a0a38777 100644 --- a/OrmTest/UnitTest/Setting/MapColumn.cs +++ b/OrmTest/UnitTest/Setting/MapColumn.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class MapColumn : ExpTestBase + public class MapColumn : UnitTestBase { public SqlSugarClient GetInstance() { diff --git a/OrmTest/UnitTest/Setting/MapTable.cs b/OrmTest/UnitTest/Setting/MapTable.cs index dad861d67..81843a385 100644 --- a/OrmTest/UnitTest/Setting/MapTable.cs +++ b/OrmTest/UnitTest/Setting/MapTable.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace OrmTest.UnitTest { - public class MapTable : ExpTestBase + public class MapTable : UnitTestBase { public void Init() { diff --git a/OrmTest/UnitTest/ExpressionTest/ExpTestBase.cs b/OrmTest/UnitTest/UnitTestBase.cs similarity index 98% rename from OrmTest/UnitTest/ExpressionTest/ExpTestBase.cs rename to OrmTest/UnitTest/UnitTestBase.cs index b83c6fe22..c4d76d06b 100644 --- a/OrmTest/UnitTest/ExpressionTest/ExpTestBase.cs +++ b/OrmTest/UnitTest/UnitTestBase.cs @@ -4,7 +4,7 @@ using SqlSugar; using System.Linq; namespace OrmTest.UnitTest { - public class ExpTestBase + public class UnitTestBase { public int Count { get; set; } private DateTime BeginTime { get; set; } diff --git a/SqlSugar/Abstract/DbProvider/DbMaintenanceProvider/DbMaintenanceProvider.cs b/SqlSugar/Abstract/DbProvider/DbMaintenanceProvider/DbMaintenanceProvider.cs index 5952713fc..f52a7a441 100644 --- a/SqlSugar/Abstract/DbProvider/DbMaintenanceProvider/DbMaintenanceProvider.cs +++ b/SqlSugar/Abstract/DbProvider/DbMaintenanceProvider/DbMaintenanceProvider.cs @@ -86,33 +86,36 @@ namespace SqlSugar { this.GetTableInfoList(); } - var entity = this.Context.MappingTables.SingleOrDefault(it => it.DbTableName.Equals(tableName, StringComparison.CurrentCultureIgnoreCase)); - var entityName = entity == null ? tableName : entity.EntityName; - var assembly = Assembly.Load(this.Context.EntityNamespace.Split('.').First()); - foreach (var item in assembly.GetType(this.Context.EntityNamespace + "." + entityName).GetProperties()) + var entities = this.Context.MappingTables.Where(it => it.DbTableName.Equals(tableName, StringComparison.CurrentCultureIgnoreCase)).ToList(); + foreach (var entity in entities) { - var isVirtual = item.GetGetMethod().IsVirtual; - if (isVirtual) continue; - var sugarColumn = item.GetCustomAttributes(typeof(SugarColumn), true) - .Where(it => it is SugarColumn) - .Select(it => (SugarColumn)it) - .Where(it => it.ColumnName.IsValuable()) - .FirstOrDefault(); - if (sugarColumn.IsNullOrEmpty()) + var entityName = entity == null ? tableName : entity.EntityName; + var assembly = Assembly.Load(this.Context.EntityNamespace.Split('.').First()); + foreach (var item in assembly.GetType(this.Context.EntityNamespace + "." + entityName).GetProperties()) { - reval.Add(new DbColumnInfo() { ColumnName = item.Name }); - } - else - { - if (sugarColumn.IsIgnore == false) + var isVirtual = item.GetGetMethod().IsVirtual; + if (isVirtual) continue; + var sugarColumn = item.GetCustomAttributes(typeof(SugarColumn), true) + .Where(it => it is SugarColumn) + .Select(it => (SugarColumn)it) + .Where(it => it.ColumnName.IsValuable()) + .FirstOrDefault(); + if (sugarColumn.IsNullOrEmpty()) { - var columnInfo = new DbColumnInfo(); - columnInfo.ColumnName = sugarColumn.ColumnName.IsNullOrEmpty() ? item.Name : sugarColumn.ColumnName; - columnInfo.IsPrimarykey = sugarColumn.IsPrimaryKey; - columnInfo.IsIdentity = sugarColumn.IsIdentity; - columnInfo.ColumnDescription = sugarColumn.ColumnDescription; - columnInfo.TableName = entity.IsNullOrEmpty() ? tableName : entity.DbTableName; - reval.Add(columnInfo); + reval.Add(new DbColumnInfo() { ColumnName = item.Name }); + } + else + { + if (sugarColumn.IsIgnore == false) + { + var columnInfo = new DbColumnInfo(); + columnInfo.ColumnName = sugarColumn.ColumnName.IsNullOrEmpty() ? item.Name : sugarColumn.ColumnName; + columnInfo.IsPrimarykey = sugarColumn.IsPrimaryKey; + columnInfo.IsIdentity = sugarColumn.IsIdentity; + columnInfo.ColumnDescription = sugarColumn.ColumnDescription; + columnInfo.TableName = entity.IsNullOrEmpty() ? tableName : entity.DbTableName; + reval.Add(columnInfo); + } } } } diff --git a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs index aa2c14930..baf253380 100644 --- a/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs +++ b/SqlSugar/Abstract/DbProvider/SqlBuilderProvider/DMLBuilder/InsertBuilder.cs @@ -46,6 +46,26 @@ namespace SqlSugar } } + public virtual string SqlTemplateBatch { + get { + return "INSERT {0} ({1})"; + } + } + + public virtual string SqlTemplateBatchSelect { + get { + return "{0} AS {1}"; + } + } + + public virtual string SqlTemplateBatchUnion + { + get + { + return "\t\r\nUNION ALL "; + } + } + public virtual void Clear() { @@ -78,9 +98,60 @@ namespace SqlSugar } public virtual string ToSqlString() { - string columnsString = string.Join(",", this.DbColumnInfoList.Select(it => Builder.GetTranslationColumnName(it.ColumnName))); - string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it => Builder.SqlParameterKeyWord + it.ColumnName)); - return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString); + var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList(); + var isSingle = groupList.Count() == 1; + string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.ColumnName))); + if (isSingle) + { + string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it => Builder.SqlParameterKeyWord + it.ColumnName)); + return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString); + } + else { + StringBuilder batchInsetrSql = new StringBuilder(); + int pageSize = 200; + int pageIndex = 1; + int totalRecord = groupList.Count; + int pageCount = (totalRecord + pageSize - 1) / pageSize; + while (pageCount >= pageIndex) { + batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString); + int i = 0; + foreach (var columns in groupList.Skip((pageIndex-1)*pageSize).Take(pageSize).ToList()) + { + var isFirst = i == 0; + if (!isFirst) + { + batchInsetrSql.Append(SqlTemplateBatchUnion); + } + batchInsetrSql.Append("\r\n SELECT " + string.Join(",", columns.Select(it => string.Format(SqlTemplateBatchSelect, FormatValue(it.Value), it.ColumnName)))); + ++i; + } + pageIndex++; + batchInsetrSql.Append("\r\nGO\r\n"); + } + return batchInsetrSql.ToString(); + } + } + + public object FormatValue(object value) + { + if (value == null) + { + return "NULL"; + } + else { + var type = value.GetType(); + if (type == PubConst.DateType) + { + return "'" + value.ObjToDate().ToString("yyyy-MM-dd hh:mm:ss.ms") + "'"; + } + else if (type == PubConst.StringType|| type == PubConst.ObjType) + { + return "N'" + value.ToString().ToSqlFilter() + "'"; + } + else { + return "N'" + value.ToString() + "'"; + } + } } } } diff --git a/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 9562be779..d9544d68b 100644 --- a/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -105,7 +105,14 @@ namespace SqlSugar } return this; } - + public IDeleteable In(List primaryKeyValues) { + if (primaryKeyValues == null || primaryKeyValues.Count() == 0) + { + Where("1=2 "); + return this; + } + return In(primaryKeyValues.ToArray()); + } public IDeleteable In(PkType[] primaryKeyValues) { if (primaryKeyValues == null || primaryKeyValues.Count() == 0) diff --git a/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index 52f39216c..c6fa3976b 100644 --- a/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -153,6 +153,7 @@ namespace SqlSugar insertItem.Add(columnInfo); } this.InsertBuilder.DbColumnInfoList.AddRange(insertItem); + ++i; } } private string GetDbColumnName(string entityName) diff --git a/SqlSugar/Interface/IDeleteable.cs b/SqlSugar/Interface/IDeleteable.cs index d29d972fe..bdc554968 100644 --- a/SqlSugar/Interface/IDeleteable.cs +++ b/SqlSugar/Interface/IDeleteable.cs @@ -16,6 +16,7 @@ namespace SqlSugar IDeleteable Where(List deleteObjs); IDeleteable In(PkType primaryKeyValue); IDeleteable In(PkType[] primaryKeyValues); + IDeleteable In(List primaryKeyValues); IDeleteable Where(string whereString,object whereObj=null); KeyValuePair> ToSql(); } diff --git a/SqlSugar/SqlSugarClient.cs b/SqlSugar/SqlSugarClient.cs index 46b85496c..53fb7df7f 100644 --- a/SqlSugar/SqlSugarClient.cs +++ b/SqlSugar/SqlSugarClient.cs @@ -253,6 +253,11 @@ namespace SqlSugar reval.Init(); return reval; } + public virtual IInsertable Insertable(List insertObjs) where T : class, new() + { + Check.ArgumentNullException(insertObjs, "Insertable.insertObjs can't be null"); + return this.Insertable(insertObjs.ToArray()); + } public virtual IInsertable Insertable(T insertObj) where T : class, new() { return this.Insertable(new T[] { insertObj });