FreeSql 新的八大骚功能

时间:2022-06-20
本文章向大家介绍FreeSql 新的八大骚功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

FreeSql 目前版本号 0.5.5,预计明年元旦发布 1.0.0,切莫小看了版本号,目前单元测试方法1350+,并且每个方法内的涵盖面又比较广(不信的话见下图),每一次版本发布都作了较多的测试工作。

最近的一段时间,关注我们的人时不时会看见扩展包发布,今天振奋人心的功能主要是核心部分实现(扩展包今天当配角)。就不多啰嗦了,咱们直接入主题。

功能一:MapType

使用 codefirst 时序列化 json 或 jsonb 数据类型报错 使用 postgresql + ef 配置数据映射关系,使用 FreeSql 的映射扩展时,对于json类型的数据映射出错。

这是来自 github 上的某个 issue,原因是用户的实体定义了 string,数据库类型为 json。FreeSql 本身支持了丰富的类型,不限于 json,但是限定了类型的映射,比如 JToken/JObject/JArray 的实体类型才可以映射至 PostgreSQL 数据库的 json 类型。另外虽然有 DbType 特性可以设置,但使用范围有限,不可跨越类型(如使用 string 可使用 DbType="char(100)")。

还有一些类似要求,如:将 enum 映射到数据库 varchar 的请求。。。。

到现在,我们已经彻底突破了这个障碍,基本可以做到随意映射类型。作为新项目开发,我们提供本身的默认类型映射已经非常人性化,提这些需求的人主要还是历史原因,咱们做程序维护工作的人员还是占比很高,千怪万怪只能怪 FreeSql 来得太迟。。。。

目前为 MapType 功能增加了大约 400 个单元测试方法。贴一段 demo 配置方法:

class EnumTestMap {    public Guid id { get; set; }//    [Column(MapType = typeof(string))]    public ToStringMapEnum enum_to_string { get; set; }    [Column(MapType = typeof(string))]    public ToStringMapEnum? enumnullable_to_string { get; set; }//    [Column(MapType = typeof(int))]    public ToStringMapEnum enum_to_int { get; set; }    [Column(MapType = typeof(int?))]    public ToStringMapEnum? enumnullable_to_int { get; set; }//    [Column(MapType = typeof(string))]    public BigInteger biginteger_to_string { get; set; }    [Column(MapType = typeof(string))]    public BigInteger? bigintegernullable_to_string { get; set; }}public enum ToStringMapEnum { 中国人, abc, 中国香港 }

应该不需要解释了吧?

细看一下,实体内有 BigInteger 类型,这可是数据库无法表示的类型,现在就是可以使用(没辙)。但请注意:BigInteger 仅仅是 CURD 方便, Equals == 判断可以使用,无法使用 + - * / < > 等操作;

默认映射

以上类型和长度是默认值,可手工设置,如 string 属性可指定 [Column(DbType = "varchar(max)")]

功能二:Unique

class AddUniquesInfo {//    public Guid id { get; set; }    [Column(Unique = "uk_phone")]    public string phone { get; set; }//    [Column(Unique = "uk_group_index")]    public string group { get; set; }    [Column(Unique = "uk_group_index")]    public int index { get; set; }//    [Column(Unique = "uk_group_index222")]    public string index22 { get; set; }}

Unique 指定相同的标识,代表联合唯一键,现已支持迁移。

功能三:弱类型

之前在操作实体时,必须传统泛型参数,现在可以实现弱类型实体的操作。以 Repository 为例:

var repos = fsql.GetGuidRepository<object>();repos.AsType(typeof(AddUpdateInfo));//var item = new AddUpdateInfo();repos.Insert(item);//item.Clicks += 1;repos.InsertOrUpdate(item);//var item2 = repos.Find(item.Id) as AddUpdateInfo;Assert.Equal(item.Clicks, item2.Clicks);//repos.DataFilter.Apply("xxx", a => (a as AddUpdateInfo).Clicks == 11);Assert.Null(repos.Find(item.Id));

然后呢,DbContext 也支持同样的操作。

dotnet add package FreeSql.DbContext

功能四:ToList & Mapper

现在支持 ToList(a => new Dto()) 这样的简单数据映射。

什么意思?即 Dto 只要有属性名与实体属性相同,就会根据匹配到的字段查询(不是查询所有字段回来再映射)。

然后这个骚操作,还支持多表查询的映射,怎么解决多表存在相同名字的字段问题呢?优先级规则,它会依次序匹配 LeftJoin/InnerJoin/RightJoin 的实体。

功能五:ToList(true) 贪婪加载

以前 .ToList() 会加载两级Join对象;

现在 ISelect.ToList(includeNestedMembers: true) 贪婪加载所有 LeftJoin/InnerJoin/RightJoin 导航数据,不论对象的层级;

功能六:WhereDynamic

支持传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}。

也就是说 WhereDynaimc 方法输入类型为 object,是不是很方便?还支持联合主键呢。

功能七:IAdo.Query 多结果

var result = fsql.Ado.Query("select * from t1; select * from t2");

功能八:FreeSql.AdminLTE

大约是前一段时间的某一天(废话),因为使用 FreeSql 的某项目需要做一个简单的后台功能,以便录入或管理数据。在实施的过程中好怀念当初 dotnetGen 生成器的味道,用它产生 curd 基本功能几乎是秒做;

FreeSql.AdminLTE,是的就是它,前段时间发布过一次。

它是 FreeSql 衍生出来的 .NETCore MVC 中间件、中间件、中间件(重复三遍)扩展包,基于 AdminLTE 前端框架动态产生实体的增删查改界面;

输入:实体1、实体2、实体3

输出:后台管理的功能

只需要传入实体,就可以形成 curd 的管理功能,是不是有些骚啊~~~

发一张运行后的图片尝个鲜: