在使用一般ORM框架时,对于复杂的数据库表结构,常常可以见到非常多的字段定义,但在我们的实际业务中,这些字段可能都有不同的逻辑归属,此外,在开发中,我们可能在数据传递,操作的过程中,希望只传递或公开一部分数据,而不是整个对象进行传递。
public class User { [Key] public Guid Id { get; set; } public string Name { get; set; } public int Age { get; set; } [Partial] public ExtraInfo ExtraInfo { get; set; } } public class ExtraInfo { public string ExtraInfo { get; set; } }
只需在对象上加上 PartialAttribute ,表示属性的对象是 当前数据集 的一部分字段所表示的子对象。
PartialAttribute 还提供了 FieldRelationship 用来进一步指定映射关系。
这样我们实现了实体类对数据表(数据集)的多对一映射,那如何实现多对多的映射呢?实际上非常简单,使用SQL,视图,存储过程进行多表查询,结合使用 PartialAttribute 即可。
三、进阶操作 1.高级查询
除了上文中提到的基本 Select<T>() 方法外,升讯威ADO.NET增强组件提供了额外的几个进阶方式进行数据查询。
a) 基本查询
public List<T> Select<T>() where T : class,new()
上文已展示。
b) 附加查询条件
public List<T> Select<T>(Dictionary<string,object> attachedWhere) where T : class,new()
通过 attachedWhere 额外的指定查询条件。Dictionary<string,object> 中的 string 和 object 分别指定字段和字段值。
为什么不使用 lamda?在一些场景中不够灵活。
c)通过 SQL 语句进行查询
既然是ADO.NET增强组件,直接使用SQL来操作当然是重头戏。
public List<T> Select<T>(string sql) where T : class
直接编写 SQL 语句进行数据查询,Select 方法可根据返回的结果集和指定的对象类型进行自动映射,返回强类型对象集合。
可以传递任意能够返回结果集的SQL语句,返回的结果集自动与泛型T匹配,泛型T也不一定就是数据库中的表所映射的对象。
d) 参数化 SQL 语句查询
public List<T> Select<T>(string sql, List<CommandParameter> parameterList) where T : class
进行参数化的 SQL 语句查询,例如:
List<CommandParameter> parameterList = new List<CommandParameter>(); parameterList.Add(, )); List<User> userList = _dataBase.Select<User>(parameterList);
2.与内存中的 DataSet 进行动态映射
当我们使用存储过程或其它方式得到一个 DataSet 时,升讯威ADO.NET增强组件支持对其进行动态映射,根据 DataSet 数据集得到强类型的对象实例或对象实例的集合。
RelationalMappingUnity 类提供了以下方法:
public static List<T> Select<T>(DataSet ds) where T : class
将 DataSet 视为一个完整数据源,从中查找指定对象类型所映射的表名进行实例化。
public static List<T> Select<T>(DataTable dt) where T : class
使用 DataTable 作为唯一数据集,对指定的对象类型进行实例化。
Select(DataRow dr, Type type) Select(DataRow dr, Type type, Dictionary<string, string> fieldPair)
上面三个方法提供了更细粒度的操作可能,直接从 DataRow 得到一个强类型的对象实例。
3.数据填充
很多时候我们需要根据某个已知条件查询得到对象实例,如我们得到 User 的 Id,希望查询数据库表得到 User 对象,在升讯威ADO.NET增强组件中,我们使用 Fill 方法既可。
public bool Fill<T>(object obj) where T : class,new()