删除

删除是一个非常危险的操作,FreeSql对删除支持并不强大,默认仅支持单表、且有条件的删除方法。

Where条件为空的时候执行,仅返回0或默认值,不执行真正的SQL删除操作。

  1. static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
  2. .UseConnectionString(FreeSql.DataType.MySql, connectionString)
  3. .UseAutoSyncStructure(true) //自动同步实体结构到数据库
  4. .Build(); //请务必定义成 Singleton 单例模式
  5. class Topic {
  6. [Column(IsIdentity = true, IsPrimary = true)]
  7. public int Id { get; set; }
  8. public int Clicks { get; set; }
  9. public string Title { get; set; }
  10. public DateTime CreateTime { get; set; }
  11. }

动态条件

  1. fsql.Delete<Topic>(object dywhere)

dywhere 支持

  • 主键值
  • new[] { 主键值1, 主键值2 }
  • Topic对象
  • new[] { Topic对象1, Topic对象2 }
  • new { id = 1 }
  1. var t1 = fsql.Delete<Topic>(new[] { 1, 2 }).ToSql();
  2. //DELETE FROM `Topic` WHERE (`Id` = 1 OR `Id` = 2)
  3. var t2 = fsql.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
  4. //DELETE FROM `Topic` WHERE (`Id` = 1)
  5. var t3 = fsql.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
  6. //DELETE FROM `Topic` WHERE (`Id` = 1 OR `Id` = 2)
  7. var t4 = fsql.Delete<Topic>(new { id = 1 }).ToSql();
  8. //DELETE FROM `Topic` WHERE (`Id` = 1)

删除条件

出于安全考虑,没有条件不执行删除动作,避免误删除全表数据。删除全表数据:fsql.Delete\().Where(“1=1”).ExecuteAffrows()

  1. var t5 = fsql.Delete<Topic>().Where(a => a.Id == 1).ToSql();
  2. //DELETE FROM `Topic` WHERE (`Id` = 1)
  3. var t6 = fsql.Delete<Topic>().Where("id = ?id", new { id = 1 }).ToSql();
  4. //DELETE FROM `Topic` WHERE (id = ?id)
  5. var item = new Topic { Id = 1, Title = "newtitle" };
  6. var t7 = fsql.Delete<Topic>().Where(item).ToSql();
  7. //DELETE FROM `Topic` WHERE (`Id` = 1)
  8. var items = new List<Topic>();
  9. for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
  10. var t8 = fsql.Delete<Topic>().Where(items).ToSql();
  11. //DELETE FROM `Topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))

字典删除

  1. var dic = new Dictionary<string, object>();
  2. dic.Add("id", 1);
  3. dic.Add("name", "xxxx");
  4. fsql.DeleteDict(dic).AsTable("table1").ExecuteAffrows();

ISelect.ToDelete 高级删除

IDelete 默认不支持导航对象,多表关联等。ISelect.ToDelete 可将查询转为 IDelete,以便使用导航对象删除数据,如下:

  1. fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToDelete().ExecuteAffrows();

注意:此方法不是将数据查询到内存循环删除,上面的代码产生如下 SQL 执行:

  1. DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1)

复杂删除使用此方法的好处:

  • 删除前可预览测试数据,防止错误删除操作;
  • 支持复杂的删除操作,例如:ISelect 上使用 Limit(10) 删除附合条件的前 10 条记录;

API

方法 返回值 参数 描述
Where \ Lambda 表达式条件,仅支持实体基础成员(不包含导航对象)
Where \ string, parms 原生sql语法条件,Where(“id = ?id”, new { id = 1 })
Where \ T1 \ IEnumerable\ 传入实体或集合,将其主键作为条件
WhereExists \ ISelect 子查询是否存在
CommandTimeout \ int 命令超时设置(秒)
WithTransaction \ DbTransaction 设置事务对象
WithConnection \ DbConnection 设置连接对象
ToSql string 返回即将执行的SQL语句
ExecuteAffrows long 执行SQL语句,返回影响的行数
ExecuteDeleted List\ 执行SQL语句,返回被删除的记录