接触 ORM 至今为止,从最初的 NHibernate、Castle、EF 相对强大的类库,到现在使用的“很黄很暴力”的 Simple.Data,已经有10年的时间。
而 ORM 之前基本都是写一句 SQL 语句查询返回 DataSet(.NET),后来在此基础上增加数据访问层 Dao 来封装,再进一步返回业务对象。
现在感触最深的还是回归到可控性最强的 SQL 但无法避免返回 DataSet 问题(虽然可以用 Reader解决),而 Simple.Data 可以牺牲一定可控性的基础上换取便利的对象操作。
安装
- 要求 .NET 4.0 或以上
- 使用 nuget 搜索 simple.data.core(核心库)
- 根据数据库引擎需要,在主项目使用 nuget 搜索 simple.data.sqldata(mysql/oracle),安装过程同时自动安装 simple.data.adoadapter
检索数据 - retrieve data
标准类型 SimpleExpression(SE),返回 SimpleQuery(SQ) 可以通过迭代 SimpleRecord(SR) 集合获取结果数据对象,此对象为 dynamic 类型,可使用强类型转换为期望类型或 IDictionary
dynamic 类型优点在于允许直接访问属性(列名) result.ColumnName,也可以通过索引访问 result[“ColumnName”](记得可以的,若不行则需要强类型转换 IDictionar
若数据存在外键,还允许在 SE 通过外键表名称直接写条件,如 table.Topic.Title.Like(“%我的心得%”),避免繁琐的 Join On。
当然,据目前使用过程还发现一些 Bug
- 存在两个或以上的外键指向同一张表,SE 只建立最后一个外键(字段顺序也可能是外键顺序,但不确认),建议出现此类情况还是使用 JOIN ON 来解决
- ToFirstOrDefault 导致从表仅返回第一条数据,建议使用 Find 或延迟加载从表数据
- Skip 且没有 Where 引起分页条件位置不正确,导致数据分页查询返回结果不正确,建议增加默认条件
- WithTotalCount 返回属性含有集合对象Bug,原因未明,建议尽量不要返回集合数据对象,改用 Select 优化,如无法避免则建议使用 dynamic 延迟加载集合对象。
Simple.Data 主要常用类型有
名称 | 缩写 | 说明 |
---|---|---|
DynamicStrategy | DS | 数据库 |
DynamicTable | DT | 数据表 |
SimpleQuery | SQ | 查询 |
SimpleExpression | SE | 条件表达式 |
SimpleRecord | SR | 记录 |
SimpleList | SL | 记录列表 |
ObjectReference | OR | 对象引用,DS.DT、DT.Field 都可转换为此对象 |
命令 | 参数 | 返回 | 说明 |
---|---|---|---|
All | SE | SQ | 返回表所有数据 |
FindAll | SE | SQ | 通过标准返回表数据 |
FindAllBy | OR[] | SQ | 通过列名和值返回表数据 |
Find | SE | SR | 通过标准返回一条表数据,若查询到多条只返回第一条 |
Get | o[] | SR | 通过主键返回一条表数据 |
GetCount | SE | int | 通过标准返回表数据数量 |
GetCountBy | str | int | 通过列名和值返回表数据数量 |
Exists/Any | SE | bool | 通过标准返回是否存在表数据 |
ExistsBy/AnyBy | str | bool | 通过列名和值返回是否存在表数据数量 |
其他注意问题
- Query、QueryBy:已过时,请使用 All、FindAllBy
- FindBy:已过时,请使用 FindAllBy.FirstOrDefault() 或 Get
- SimpleQuery:可以使用迭代或 ToList、ToFirstOrDefault、ToScalar 等 Linq 相似的方法或数据对象