diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 7312f114..95dfcc5a 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -26,17 +26,32 @@ namespace base_entity public T Config { get; set; } } + public class Products : BaseEntity + { + public string title { get; set; } + } + static void Main(string[] args) { #region 初始化 IFreeSql - BaseEntity.Initialization(new FreeSql.FreeSqlBuilder() + var fsql = new FreeSql.FreeSqlBuilder() .UseAutoSyncStructure(true) .UseNoneCommandParameter(true) .UseConnectionString(FreeSql.DataType.Sqlite, "data source=test.db;max pool size=5") - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2") - .Build()); + //.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=2") + .Build(); + BaseEntity.Initialization(fsql); #endregion + new Products { title = "product-1" }.Save(); + new Products { title = "product-2" }.Save(); + new Products { title = "product-3" }.Save(); + new Products { title = "product-4" }.Save(); + new Products { title = "product-5" }.Save(); + + var items1 = Products.Select.Limit(10).OrderByDescending(a => a.CreateTime).ToList(); + var items2 = fsql.Select().Limit(10).OrderByDescending(a => a.CreateTime).ToList(); + BaseEntity.Orm.UseJsonMap(); new S_SysConfig { Name = "testkey11", Config = new TestConfig { clicks = 11, title = "testtitle11" } }.Save(); @@ -44,6 +59,8 @@ namespace base_entity new S_SysConfig { Name = "testkey33", Config = new TestConfig { clicks = 33, title = "testtitle33" } }.Save(); var testconfigs11 = S_SysConfig.Select.ToList(); + var repo = BaseEntity.Orm.Select().Limit(10).ToList(); + Task.Run(async () => { using (var uow = BaseEntity.Begin()) @@ -111,6 +128,8 @@ namespace base_entity }).Wait(); + + Console.WriteLine("按任意键结束。。。"); Console.ReadKey(); } diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9c0597d5..1a43f59e 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -106,6 +106,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs index e1ba8a33..3f1e5f78 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs @@ -18,6 +18,7 @@ public class g static Lazy sqlserverLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.OdbcSqlServer, "Driver={SQL Server};Server=.;Persist Security Info=False;Trusted_Connection=Yes;Integrated Security=True;DATABASE=freesqlTest_odbc;Pooling=true;Max pool size=3") + //.UseConnectionString(FreeSql.DataType.OdbcSqlServer, "Driver={SQL Server};Server=192.168.164.129;Persist Security Info=False;Trusted_Connection=Yes;UID=sa;PWD=123456;DATABASE=ds_shop;") .UseAutoSyncStructure(true) .UseMonitorCommand( cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前 diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs index d0e746de..4e1c40ae 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs @@ -129,6 +129,29 @@ namespace FreeSql.Tests.MySql //insert.AppendData(items.First()).ExecuteInserted(); } + [Fact] + public void MySqlIgnoreInto() + { + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + + Assert.Equal(1, insert.MySqlIgnoreInto().AppendData(items.First()).ExecuteAffrows()); + Assert.Equal(10, insert.MySqlIgnoreInto().AppendData(items).ExecuteAffrows()); + + Assert.Equal(1, g.mysql.Insert().MySqlIgnoreInto().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).ExecuteAffrows()); + Assert.Equal(1, g.mysql.Insert().MySqlIgnoreInto().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteAffrows()); + + items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 }); + + Assert.NotEqual(0, insert.MySqlIgnoreInto().AppendData(items.First()).ExecuteIdentity()); + + var id = g.mysql.Insert().MySqlIgnoreInto().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).ExecuteIdentity(); + Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select().Where(a => a.id == id).First()?.type); + id = g.mysql.Insert().MySqlIgnoreInto().AppendData(new TestEnumInsertTb { type = TestEnumInserTbType.sum211 }).NoneParameter().ExecuteIdentity(); + Assert.Equal(TestEnumInserTbType.sum211, g.mysql.Select().Where(a => a.id == id).First()?.type); + } + [Fact] public void AsTable() { diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 6efd2d1e..2fe6231a 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -35,6 +35,7 @@ public class g static Lazy sqlserverLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3") + //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=192.168.164.129;uid=sa;pwd=123456;Initial Catalog=ds_shop;Pooling=true;Max Pool Size=3") .UseAutoSyncStructure(true) .UseMonitorCommand( cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index dd964856..ff488d7c 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2000,137 +2000,6 @@ - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) - - - - - - - 查询 - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) - - - - - - 可自定义解析表达式 diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index c49a4597..20af4f0b 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -17,6 +17,7 @@ namespace FreeSql.MySql.Curd { } + internal bool InternalIsIgnoreInto = false; internal IFreeSql InternalOrm => _orm; internal TableInfo InternalTable => _table; internal DbParameter[] InternalParams => _params; @@ -33,6 +34,13 @@ namespace FreeSql.MySql.Curd public override List ExecuteInserted() => base.SplitExecuteInserted(5000, 3000); + public override string ToSql() + { + if (InternalIsIgnoreInto == false) return base.ToSqlValuesOrSelectUnionAll(); + var sql = base.ToSqlValuesOrSelectUnionAll(); + return $"INSERT IGNORE INTO {sql.Substring(12)}"; + } + protected override long RawExecuteIdentity() { var sql = this.ToSql(); diff --git a/Providers/FreeSql.Provider.MySql/MySqlExtensions.cs b/Providers/FreeSql.Provider.MySql/MySqlExtensions.cs index 262aa716..40e19c5f 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExtensions.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExtensions.cs @@ -1,5 +1,6 @@ using FreeSql; using FreeSql.MySql.Curd; +using System; public static partial class FreeSqlMySqlGlobalExtensions { @@ -22,4 +23,17 @@ public static partial class FreeSqlMySqlGlobalExtensions /// public static OnDuplicateKeyUpdate OnDuplicateKeyUpdate(this IInsert that) where T1 : class => new FreeSql.MySql.Curd.OnDuplicateKeyUpdate(that.InsertIdentity()); + /// + /// MySql 特有的功能,Insert Ignore Into + /// + /// + /// + /// + public static IInsert MySqlIgnoreInto(this IInsert that) where T1 : class + { + var _mysqlInsert = that as MySqlInsert; + if (_mysqlInsert == null) throw new Exception("MySqlIgnoreInto 是 FreeSql.Provider.MySql/FreeSql.Provider.MySqlConnector 特有的功能"); + _mysqlInsert.InternalIsIgnoreInto = true; + return that; + } } diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs index 73f2f92f..a8432057 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs @@ -22,34 +22,14 @@ namespace FreeSql.SqlServer.Curd public override long ExecuteIdentity() => base.SplitExecuteIdentity(1000, 2100); public override List ExecuteInserted() => base.SplitExecuteInserted(1000, 2100); - protected override int RawExecuteAffrows() + public override string ToSql() { var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - var affrows = 0; - Exception exception = null; - try - { - affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, affrows); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return affrows; + return this.ToSqlValuesOrSelectUnionAll(versionGreaterThan10); } protected override long RawExecuteIdentity() { - var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false); + var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); @@ -75,8 +55,7 @@ namespace FreeSql.SqlServer.Curd } protected override List RawExecuteInserted() { - var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql(): this.ToSqlValuesOrSelectUnionAll(false); + var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); var sb = new StringBuilder(); @@ -89,7 +68,7 @@ namespace FreeSql.SqlServer.Curd ++colidx; } - if (versionGreaterThan10) + if ((_commonUtils as SqlServerUtils).ServerVersion > 10) { var validx = sql.IndexOf(") VALUES"); if (validx == -1) throw new ArgumentException("找不到 VALUES"); @@ -132,34 +111,9 @@ namespace FreeSql.SqlServer.Curd public override Task ExecuteIdentityAsync() => base.SplitExecuteIdentityAsync(1000, 2100); public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); - async protected override Task RawExecuteAffrowsAsync() - { - var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); - _orm.Aop.CurdBefore?.Invoke(this, before); - var affrows = 0; - Exception exception = null; - try - { - affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params); - } - catch (Exception ex) - { - exception = ex; - throw ex; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, affrows); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return affrows; - } async protected override Task RawExecuteIdentityAsync() { - var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false); + var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; sql = string.Concat(sql, "; SELECT SCOPE_IDENTITY();"); @@ -185,8 +139,7 @@ namespace FreeSql.SqlServer.Curd } async protected override Task> RawExecuteInsertedAsync() { - var versionGreaterThan10 = (_commonUtils as SqlServerUtils).ServerVersion > 10; - var sql = versionGreaterThan10 ? this.ToSql() : this.ToSqlValuesOrSelectUnionAll(false); + var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); var sb = new StringBuilder(); @@ -199,7 +152,7 @@ namespace FreeSql.SqlServer.Curd ++colidx; } - if (versionGreaterThan10) + if ((_commonUtils as SqlServerUtils).ServerVersion > 10) { var validx = sql.IndexOf(") VALUES"); if (validx == -1) throw new ArgumentException("找不到 VALUES");