fastCSharp是一个基于.NET元数据的代码生成的底层应用框架,目标是打造一个“开发+运行”效率双优的开源框架。经过半年多的时间,除了与web开发直接相关的部分,都已经在fastCSharppart1.5中完成了重写工作。fastCSharp现在实现的代码生成实例主要有5个:1、基于缓存查询模式的ORM代码生成实例(现在只支持MSSQL),自定义配置类是fastCSharp.setup.cSharp.sqlTable,同时支持反射模式fastCSharp.setup.cSharp.sqlTable.sqlTool。下面是ORM的model定义示例12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 [fastCSharp.setup.cSharp.sqlTable(CoectioName = "Coectio1")] public partial class model1 { /// /// 自增列,一个表格只允许一个,如果不配置IsIdetity = true,将自动匹配名称为 id 的成员 /// [fastCSharp.setup.sqlMember(IsIdetity = true)] public it id; /// /// 关键字1,多个关键字成员按照成员定义顺序一致 /// [fastCSharp.setup.sqlMember(IsPrimaryKey = true)] public it key1; /// /// 关键字2 /// [fastCSharp.setup.sqlMember(IsPrimaryKey = true, IsAscii = true, MaxLegth = 32)] public strig key2; public eum EumByte : byte { Eum1 } /// /// 直接支持枚举类型转换,可以不指定SqlType = typeof(byte) /// [fastCSharp.setup.sqlMember(SqlType = typeof(byte))] public EumByte key2; /// /// 指定隐式类型转换 /// [fastCSharp.setup.sqlMember(SqlType = typeof(strig))] public partial struct image { public strig url; /// /// 如果不能隐式类型转换,必须实现互转函数 /// public static implicit operator image(strig url) { retur ew image { url = url }; } public static implicit operator strig(image image) { retur image.url; } } /// /// 支持隐式类型转换 /// [fastCSharp.setup.sqlMember(IsAscii = true, MaxLegth = 64)] public image ico = strig.Empty; } fastCSharp的配置文件是一个纯数据的jso格式文件,比如Coectio1的配置定义123456789101112{sql: { checkCoectio:["Coectio1"], Coectio1: { Diatou:{ Type:"sql2008", Coectio:"server=192.168.0.100;database=dbame;uid=userame;pwd=password" } } }} 下面是代码生成模式示例,采用派生类的模式1234567891011121314 public partial class bModel1 : model1.sqlTable { static bModel1() { if (SqlTool != ull) { //定义缓存 Cache = ew fastCSharp.sql.cache.whole.idetityArray(SqlTool); //定义缓存同步个性化处理事件 Cache.OIserted += XXX; Cache.OUpdated += XXX; } } } 有时候多个表格结构相同,那么只需要定义一个model,比如可以12345678910 public abstract class bModelBase : model1.sqlTable where tableType : bModelBase { } public partial class bModel1_1 : bModelBase { } public partial class bModel1_N : bModelBase { } 下面是反射模式示例1234567891011 public class bModel1 : model1 { private static readoly fastCSharp.setup.cSharp.sqlTable.sqlTool sqlTool = fastCSharp.setup.cSharp.sqlTable.sqlTool.Default; static bModel1() { if (sqlTool != ull) { //缓存定义与事件定义 和 代码生成模式示例一样 } } } 有人说ORM不适应于复杂的综合查询。真的吗?我现在展示一段查询代码12345678910111213141516 retur diatou.dataProxy.questioTopic.getTopicCache(id) .getArray(value => diatou.dataProxy.questio.get(value.likId)) .getHash(value => value.bestAswerId) .getArray(value => diatou.dataProxy.aswer.get(value)) .getFid(value => value != ull) .group(value => value.userId) .getArray(value => ew keyValue(diatou.dataProxy.user.get(value.Key), value.Value.Cout)) .group(value => value.Key.grade0) .getArray(value => ew userStat { grade0 = value.Key, cout = value.Value.Cout, path = topic.path.bestAswer, users = value.Value.rageSort((left, right) => right.Value - left.Value, 0, 6) .getArray(user => diatou.dataProxy.user.get(user.Key, userId)) }); 这个查询需求是,先根据话题(topic)ID查找相关联的问题(questio)ID集合,然后找到这些问题的最佳答案(aswer)ID集合,然后根据这些答案的用户(user)ID分组统计答案数量,最后将这些用户根据用户等级分组,每个分组根据答案数量取前6个用户。我个人认为基于ORM的查询更简单流畅。如果用SQL实现这个需求,该是一个多么复杂的SQL语句?如果需求有一点点变化,修改这个SQL语句该是多麻烦的事?2、数据类快速序列化代码生成实例,自定义配置类是fastCSharp.setup.cSharp.serialize,同时支持反射模式。1234567 /// /// 仅仅选择字段成员,反射模式可以不必配置 /// [fastCSharp.setup.cSharp.serialize(Filter = fastCSharp.setup.memberFilter.IstaceField)] public partial class model1 { } 代码生成模式将实现接口fastCSharp.setup.cSharp.serialize.ISerialize123456789
点击空白处退出提示
评论