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 });