diff --git a/骚操作.md b/骚操作.md index 96f9d05..e6f065a 100644 --- a/骚操作.md +++ b/骚操作.md @@ -37,7 +37,33 @@ repo.InsertOrUpdate(实体); --- -# 4、WithSql +## 4、弱类型 CURD + +```c# +fsql.Insert().AsType(实体类型) + .AppendData(data) + .ExecuteAffrows(); + +fsql.Update().AsType(实体类型) + .SetSource(data) + .ExecuteAffrows(); + +fsql.Select().AsType(实体类型) + .Where(a => (a as BaseEntity).Id == 1) + .ExecuteAffrows(); + +//或者仓储 +var repo = fsql.GetRepository(); +repo.AsType(实体类型); + +repo.Insert(..); +repo.Update(..); +repo.Delete(..); +``` + +--- + +# 5、WithSql ```csharp fsql.Select() .WithSql("select * from Topic where clicks > @val", new { val = 10 }) @@ -51,7 +77,7 @@ fsql.Select() --- -# 5、你不知道的,指定字段返回 +# 6、你不知道的,指定字段返回 ```csharp fsql.Select() @@ -73,7 +99,7 @@ fsql.Select() --- -# 6、Dto 映射查询 +# 7、Dto 映射查询 映射查询支持单表/多表,在查询数据之前映射(不是先查询所有字段再到内存映射) @@ -117,7 +143,7 @@ fsql.Select().ToList(a => new Song(a.id) { xxx = a.ext }) --- -# 7、父子关系表 +# 8、父子关系表 ```csharp List t2 = fsql.Select.ToTreeList(); @@ -145,7 +171,7 @@ Assert.Equal("中国[100000] -> 北京[110000] -> 北京市[110100]", t4[2].path Assert.Equal("中国[100000] -> 北京[110000] -> 东城区[110101]", t4[3].path); ``` -# 8、级联加载 +# 9、级联加载 有设置导航属性关系的(支持一对多、多对多): @@ -190,7 +216,7 @@ fsql.Select().IncludeMany(a => a.Goods.Select(b => new Goods { Id = b.Id, T --- -# 9、WhereCascade +# 10、WhereCascade 多表查询时,像isdeleted每个表都给条件,挺麻烦的。WhereCascade使用后生成sql时,所有表都附上这个条件。 @@ -216,7 +242,7 @@ WHERE t1.IsDeleted = 0 --- -# 10、WhereDynamicFilter +# 11、WhereDynamicFilter ISelect.WhereDynamicFilter 方法实现动态过滤条件(与前端交互),支持的操作符: @@ -227,6 +253,7 @@ ISelect.WhereDynamicFilter 方法实现动态过滤条件(与前端交互) - Range:范围查询 - DateRange:日期范围,有特殊处理 value\[1\] + 1 - Any/NotAny:是否符合 value 中任何一项(直白的说是 SQL IN) +- Custom:自定义解析 ```csharp DynamicFilterInfo dyfilter = JsonConvert.DeserializeObject(@" @@ -253,7 +280,7 @@ fsql.Select().WhereDynamicFilter(dyfilter).ToList(); --- -# 11、ISelect.ToDelete、ISelect.ToUpdate +# 12、ISelect.ToDelete、ISelect.ToUpdate 默认 IDelete 不支持导航对象,多表关联等。ISelect.ToDelete 可将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下: @@ -275,7 +302,7 @@ DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1i --- -# 12、保存多对多数据 SaveMany +# 13、保存多对多数据 SaveMany 之前: @@ -319,7 +346,7 @@ SaveMany【多对多】的机制规则与联级保存的一样,如下: --- -# 13、自定义表达式函数 +# 14、自定义表达式函数 ```csharp [ExpressionCall] @@ -358,7 +385,7 @@ var sql1 = fsql.Select() --- -# 14、自定义实体特性、与其他 ORM 共用特性 +# 15、自定义实体特性、与其他 ORM 共用特性 本功能可实现与其他 ORM 使用一套 Attribute,避免维护两份实体特性的烦恼: @@ -400,7 +427,7 @@ class MyColumnAttribute : Attribute { --- -# 15、审计 CURD +# 16、审计 CURD 如果因为某个 sql 骚操作耗时很高,没有一个相关的审计功能,排查起来可以说无从下手。 @@ -421,7 +448,7 @@ fsql.Aop.CurdAfter += (s, e) => { --- -# 16、审计属性值 +# 17、审计属性值 实现插入/更新时统一处理某些值,比如某属性的雪花算法值、创建时间值、甚至是业务值。 @@ -446,7 +473,7 @@ class Order { 如果命名规范,可以在 aop 里判断,if (e.Property.Name == "createtime") e.Value = DateTime.Now; -# 17、Ado.Net 扩展方法 +# 18、Ado.Net 扩展方法 提供了类似 Dapper 的使用方法,FreeSql 增加了 IDbConnection/IDbTransaction 对象的扩展方法 Select/Insert/Update/Delete 实现 CRUD。