刪除是一個非常危險的操作,FreeSql對刪除支持並不強大,僅支持了單表有條件的刪除方法。
不想過多的介紹拉長刪除數據的系列文章,刪除數據的介紹僅此一篇。
若Where條件為空的時候執行方法,FreeSql僅返回0或默認值,不執行真正的SQL刪除操作。
為了增強系統的安全性,強烈建議在實體中增加 is_deledted 字段做軟刪除標識。
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" +
"Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";
static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, connstr)
.UseAutoSyncStructure(true) //自動同步實體結構到數據庫
.Build(); //請務必定義成 Singleton 單例模式
[Table(Name = "tb_topic")]
class Topic {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
動態條件
Delete<Topic>(object dywhere)
dywhere 支持
- 主鍵值
- new[] { 主鍵值1, 主鍵值2 }
- Topic對象
- new[] { Topic對象1, Topic對象2 }
- new { id = 1 }
var t1 = fsql.Delete<Topic>(new[] { 1, 2 }).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
var t2 = fsql.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
var t3 = fsql.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
var t4 = fsql.Delete<Topic>(new { id = 1 }).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
刪除條件
出於安全考慮,沒有條件不執行刪除動作,避免誤刪除全表數據
刪除全表數據:fsql.Delete<T>().Where("1=1").ExecuteAffrows()
var t5 = fsql.Delete<Topic>().Where(a => a.Id == 1).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
var t6 = fsql.Delete<Topic>().Where("id = ?id", new { id = 1 }).ToSql();
//DELETE FROM `tb_topic` WHERE (id = ?id)
var item = new Topic { Id = 1, Title = "newtitle" };
var t7 = fsql.Delete<Topic>().Where(item).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var t8 = fsql.Delete<Topic>().Where(items).ToSql();
//DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
ISelect.ToDelete 高級刪除
默認 IDelete 不支持導航對象,多表關聯等。ISelect.ToDelete 可將查詢轉為刪除對象,以便支持導航對象或其他查詢功能刪除數據,如下:
fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToDelete().ExecuteAffrows();
注意:此方法不是將數據查詢到內存循環刪除,上面的代碼產生如下 SQL 執行:
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)
復雜刪除使用該方案的好處:
- 刪除前可預覽測試數據,防止錯誤刪除操作;
- 支持更加復雜的刪除操作(IDelete 默認只支持簡單的操作),甚至在 ISelect 上使用 Limit(10) 將只刪除附合條件的前 10條記錄;
API
| 方法 | 返回值 | 參數 | 描述 |
|---|---|---|---|
| Where | <this> | Lambda | 表達式條件,僅支持實體基礎成員(不包含導航對象) |
| Where | <this> | string, parms | 原生sql語法條件,Where("id = ?id", new { id = 1 }) |
| Where | <this> | T1 | IEnumerable
|
傳入實體或集合,將其主鍵作為條件 |
| WhereExists | <this> | ISelect | 子查詢是否存在 |
| WithTransaction | <this> | DbTransaction | 設置事務對象 |
| ToSql | string | 返回即將執行的SQL語句 | |
| ExecuteAffrows | long | 執行SQL語句,返回影響的行數 | |
| ExecuteDeleted | List<T1> | 執行SQL語句,返回被刪除的記錄 |
系列文章導航
-
(九)刪除數據
