61制作工厂网站,短视频营销国内外研究现状,仿系统之家网站源码,科技与人文年关将至#xff0c;首页技术含量文章真是越来越少#xff0c;理解大家盼着放假过年#xff0c;哥们我何尝不是#xff0c;先给大家拜个早年。兄弟我从11月底发了神经#xff0c;开启了 ORM 功能库的开发之旅#xff0c;历时两个月编码和文档整理#xff0c;目前预览版本… 年关将至首页技术含量文章真是越来越少理解大家盼着放假过年哥们我何尝不是先给大家拜个早年。兄弟我从11月底发了神经开启了 ORM 功能库的开发之旅历时两个月编码和文档整理目前预览版本更新到 v0.0.9 仍是一个初级版本怎奈今天把 wiki 文档更新到一半突然想写一篇文章提前向大家介绍项目。快过年还逼着您来了解新的技术实在是抱歉了。介绍一下自己有一些朋友可能知道我本人我经常会在群里放开源项目比如 dotnetGen、csredis 等反感之余仍然希望可以真的帮助到有需要的人CSRedisCore 正是本人维护的项目本文介绍的不是它。简单点介绍FreeSql 是一个NETStandard ORM 功能库采用 MIT 开源协议部署在 github。它实现了的功能特性[x] CodeFirst 迁移。[x] DbFirst 从数据库导入实体类支持三种模板生成器。[x] 采用 ExpressionTree 高性能读取数据。[x] 类型映射深入支持比如pgsql的数组类型。[x] 支持丰富的表达式函数。[x] 支持导航属性查询和延时加载。[x] 支持同步/异步数据库操作方法丰富多彩的链式查询方法。[x] 支持事务。[x] 支持读写分离。[x] 支持多种数据库MySql/SqlServer/PostgreSQL/Oracle/Sqlite。快速开始定义实体可从现有数据库生成实体模型提供 IDbFirst 生成实体模型。或者手动创建模型基于模型创建或修改数据库提供 ICodeFirst 同步结构的 API甚至可以做到开发阶段自动同步。查询普通查询每页20条数据查询第1页var sql select.Page(1, 20).ToSql();///SELECT ... FROM tb_topic a LIMIT 0,20利用导航属性联表子表 Exists 查询查找今天创建的数据select.Where(a a.CreateTime.Date DateTime.Now.Date).ToSql();支持功能丰富的表达式函数解析包括字符串、日期、时间、数学、类型转换等函数方便程序员在不了解数据库函数的情况下编写代码。这是非常特色的功能之一深入细化函数解析尽量做到满意所支持的类型基础都可以使用对应的表达式函数例如 日期、字符串、IN查询、数组PostgreSQL的数组、字典PostgreSQL HStore)等等。获得查询返回的数据采用 ExpressionTree 优化读取速读如果懂技术的你一定知道 .NETCore 技术下除了原生代码最快就是 Emit 和 ExpressionTree。项目在初期使用的反射缓存虽然 .NETCore 优化了反射性能但经过与Dapper性能测试对比之后发现仍然有一定差距改成 ExpresstionTree 后才与 Dapper 性能相当。FreeSql 支持的类型较多现实 ExpressionTree 的复杂度较大有兴趣的朋友可以翻阅源代码。返回单条记录Topic t1 select.Where(a a.Id 1).ToOne();FreeSql有两个约定ToOne 永远返回 null 或 有数据的实体对象ToList 永远返回非 null 的 List实体类型返回 ListListTopic t1 select.Where(a a.Id 0).Skip(100).Limit(200).ToList();返回 List 导航属性的数据ListTopic t2 select.LeftJoin(a a.Type.Guid a.TestTypeInfoGuid).ToList();//此时会返回普通字段 导航对象 Type 的数据指定字段返回执行SQL返回数据CodeFirst支持 CodeFirst 迁移结构至数据库这应该是(O/RM)必须标配的一个功能。与其他(O/RM)不同FreeSql支持更多的数据库特性而不只是支持基础的数据类型这既是优点也是缺点优点是充分利用数据库特性辅助开发缺点是切换数据库变得困难。不同程序员的理念可能不太一致作为功能库FreeSql支持到了极致至于是否使用是项目组技术衡量的另一个问题。尽管多种数据库适配逻辑非常复杂FreeSql始终秉承优化程序开发习惯的原则尽量去现实中间碰到了一些非技术无法攻克的难题比如数据库的自定义类型和实体类本身就是一种冲突为了减少使用成本诸如此类的数据库功能没有得到支持。除了在实体上标注特性也支持实体以外配置类型映射csharpMySqlSqlServerPostgreSQLOracleSqlitebool | bool?bit(1)bitboolnumber(1)booleansbyte | sbyte?tinyint(3)smallintint2number(4)smallintshort | short?smallint(6)smallintint2number(6)smallintint | int?int(11)intint4number(11)integerlong | long?bigint(20)bigintint8number(21)integerbyte | byte?tinyint(3) unsignedtinyintint2number(3)int2ushort | ushort?smallint(5) unsignedintint4number(5)unsigneduint | uint?int(10) unsignedbigintint8number(10)decimal(10,0)ulong | ulong?bigint(20) unsigneddecimal(20,0)numeric(20,0)number(20)decimal(21,0)double | double?doublefloatfloat8float(126)doublefloat | float?floatrealfloat4float(63)floatdecimal | decimal?decimal(10,2)decimal(10,2)numeric(10,2)number(10,2)decimal(10,2)Guid | Guid?char(36)uniqueidentifieruuidchar(36 CHAR)character(36)TimeSpan | TimeSpan?timetimetimeinterval day(2) to second(6)bigintDateTime | DateTime?datetimedatetimetimestamptimestamp(6)datetimeDateTimeOffset | DateTimeOffset?--datetimeoffsettimestamp(6) with local time zone-Enum | Enum?enumintint4number(16)mediumintFlagsEnum | FlagsEnum?setbigintint8number(32)bigintbyte[]varbinary(255)varbinary(255)byteablobblobstringvarchar(255)nvarchar(255)varchar(255)nvarchar2(255)nvarchar(255)MygisPointpoint----MygisLineStringlinestring----MygisPolygonpolygon----MygisMultiPointmultipoint----MygisMultiLineStringmultilinestring----MygisMultiPolygonmultipolygon----BitArray--varbit(64)--NpgsqlPoint | NpgsqlPoint?--point--NpgsqlLine | NpgsqlLine?--line--NpgsqlLSeg | NpgsqlLSeg?--lseg--NpgsqlBox | NpgsqlBox?--box--NpgsqlPath | NpgsqlPath?--path--NpgsqlPolygon | NpgsqlPolygon?--polygon--NpgsqlCircle | NpgsqlCircle?--circle--(IPAddress Address, int Subnet) | (IPAddress Address, int Subnet)?--cidr--IPAddress--inet--PhysicalAddress--macaddr--NpgsqlRangeint | NpgsqlRangeint?--int4range--NpgsqlRangelong | NpgsqlRangelong?--int8range--NpgsqlRangedecimal | NpgsqlRangedecimal?--numrange--NpgsqlRangeDateTime | NpgsqlRangeDateTime?--tsrange--PostgisPoint--geometry--PostgisLineString--geometry--PostgisPolygon--geometry--PostgisMultiPoint--geometry--PostgisMultiLineString--geometry--PostgisMultiPolygon--geometry--PostgisGeometry--geometry--PostgisGeometryCollection--geometry--Dictionarystring, string--hstore--JToken--jsonb--JObject--jsonb--JArray--jsonb--数组--以上所有类型都支持--以上类型和长度是默认值可手工设置如 string 属性可指定 [Column(DbType varchar(max))]DbFirstFreeSql 同样支持 DbFirst 的开发模式即先有数据库再有项目这种传统的开发模式永远不会过时特别适合老项目仍然在维护或者数据库重构成本过高的项目。关系型数据库有许多成熟的运维和开发类配套工具例如我们所关注的ER图工具 PowerdeSigner使用它可以更直观的查看表之间的关系。除了FreeSql作者同时在维护超过十年的代码生成器dotnetGen项目它是一款支持超快速开发且高度可控的解决方案非常喜欢 DbFirst 的开发模式因此在 FreeSql for DbFirst 功能上会有不错的支持。DbFirst 模式开发主要提供了不同数据库的表结构查询适配配合模板生成器现实从数据库导入模型到c#代码中。生成器是基于 DbFirst 开发的辅助工具适用老项目一键生成实体。生成器采用模板的方式实现了三种生成模板模板名称路径类型映射外键导航属性缓存管理失血贫血充血simple-entity../Templates/MySql/simple-entity√XX√XXsimple-entity-navigation-object../Templates/MySql/simple-entity-navigation-object√√X√XXrich-entity-navigation-object../Templates/MySql/rich-entity-navigation-object√√√X√X结语项目功能与文档较多许多细节不适合在一篇文章中展示详尽更多的功能介绍请移步 github wiki 中心。借此文章介绍FreeSql这个国产ORM希望能得到大家的支持。FreeSql 口号打造 .NETCore 最方便的 ORM项目地址https://github.com/2881099/FreeSql文档中心https://github.com/2881099/FreeSql/wiki最后诚心邀请您的参与加入一起完成 FreeSql 的使命。原文地址https://www.cnblogs.com/kellynic/p/10310484.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com