[开源] .Net ORM FreeSql 1.10.0 稳步向行 (3)

上面增加了两个过滤器,tenant 第二个参数正是增加的功能,当委托条件成立时才会附加过滤器。

增加 ISelect.InsertInto 将查询转换为 INSERT INTO t1 SELECT ... FROM t2 执行插入; int affrows = fsql.Select<Topic>() .Limit(10) .InsertInto(null, a => new Topic2 { Title = a.Title }); INSERT INTO `Topic2`(`Title`, `Clicks`, `CreateTime`) SELECT a.`Title`, 0, '0001-01-01 00:00:00' FROM `Topic` a limit 10

注意:因为 Clicks、CreateTime 没有被选择,所以使用目标实体属性 [Column(InsertValueSql = xx)] 设置的值,或者使用目标实体属性的 c# 默认值。

又一次完善了批量操作数据的功能,之前已经有的功能如下:

fsql.InsertOrUpdate 相当于 Merge Into/on duplicate key update

Database Features Database Features
MySql   on duplicate key update     达梦   merge into  
PostgreSQL   on conflict do update     人大金仓   on conflict do update  
SqlServer   merge into     神通   merge into  
Oracle   merge into     MsAccess   不支持  
Sqlite   replace into        
Firebird   merge into        

fsql.Insert(数组).ExecuteAffrows() 相当于批量插入

var t2 = fsql.Insert(items).ExecuteAffrows(); //INSERT INTO `Topic`(`Clicks`, `Title`, `CreateTime`) //VALUES(?Clicks0, ?Title0, ?CreateTime0), (?Clicks1, ?Title1, ?CreateTime1), //(?Clicks2, ?Title2, ?CreateTime2), (?Clicks3, ?Title3, ?CreateTime3), //(?Clicks4, ?Title4, ?CreateTime4), (?Clicks5, ?Title5, ?CreateTime5), //(?Clicks6, ?Title6, ?CreateTime6), (?Clicks7, ?Title7, ?CreateTime7), //(?Clicks8, ?Title8, ?CreateTime8), (?Clicks9, ?Title9, ?CreateTime9)

当插入大批量数据时,内部采用分割分批执行的逻辑进行。分割规则:

数量 参数量
MySql   5000   3000  
PostgreSQL   5000   3000  
SqlServer   1000   2100  
Oracle   500   999  
Sqlite   5000   999  

fsql.Insert(数组).ExecuteSqlBulkCopy、ExecutePgCopy、ExecuteMySqlBulkCopy

fsql.Update<T>().SetSource(数组).ExecuteAffrows() 相当于批量更新

增加 IncludeMany(a => a.Childs).ToList(a => new { a.Childs }) 指定集合属性返回;

这个功能实在太重要了,在此之前 IncludeMany 和 ToList(指定字段) 八字不合,用起来有些麻烦。现在终于解决了!!~~

var t111 = fsql.Select<TestInclude_OneToManyModel1>() .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id)) .Where(a => a.id <= model1.id) .ToList(a => new { a.id, a.model2.childs, childs2 = a.model2.childs }); 增加 $"{a.Code}_{a.Id}" lambda 解析;

在之前查询数据的时候,$"" 这种语法糖神器居然不能使用在 lambda 表达式中,实属遗憾。现在终于可以了,如下:

var item = fsql.GetRepository<Topic>().Insert(new Topic { Clicks = 101, Title = "我是中国人101", CreateTime = DateTime.Parse("2020-7-5") }); var sql = fsql.Select<Topic>().WhereDynamic(item).ToSql(a => new { str = $"x{a.Id + 1}z-{a.CreateTime.ToString("yyyyMM")}{a.Title}{a.Title}" }); Assert.Equal($@"SELECT concat('x',ifnull((a.`Id` + 1), ''),'z-',ifnull(date_format(a.`CreateTime`,'%Y%m'), ''),'',ifnull(a.`Title`, ''),'',ifnull(a.`Title`, ''),'') as1 FROM `tb_topic` a WHERE (a.`Id` = {item.Id})", sql);

再次说明:都是亲儿子,并且都有对应的单元测试,兄台大可放心用在不同的数据库中

增加 lambda 表达式树解析子查询 ToList + string.Join() 产生 类似 group_concat 的效果;

v1.8.0+ string.Join + ToList 实现将子查询的多行结果,拼接为一个字符串,如:"1,2,3,4"

fsql.Select<Topic>().ToList(a => new { id = a.Id, concat = string.Join(",", fsql.Select<StringJoin01>().ToList(b => b.Id)) }); //SELECT a.`Id`, (SELECT group_concat(b.`Id` separator ',') // FROM `StringJoin01` b) //FROM `Topic` a

该语法,在不同数据库都作了相应的 SQL 翻译。

增加 SqlExt 常用的自定义表达式树解析;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzywx.html