前言
我们知道对于关系数据库,视图的出现可以在一定的情况下减少因要进行数据关联而带来的大量SQL语句,它可以让我们就像访问一张表一样的简单操作。
作为ORM来说,支持视图也是一项最基础的工作。然而大部份的ORM中,对视图没有特意去提供这个类,因为视图的SQL与表的SQL是一致的,因此可以将视图当成表来访问操作。
而在Farseer.Net里为视图提供了专门的类的目的是告诉开发者,它是一个只读“表”,仅读、而不能进行任何数据更新操作。
ViewSet
在前一篇文章里,我们学会了视图的映射,其它它与表的映射是基本一致的。除了 表 是使用: TableSet , 而 视图 使用的是 ViewSet 。
到目前为止,相信大家也知道了 xxxSet的作用,就是为这些特定“表”、“视图”、“存储过程”提供它们专用的方法,以便我们对数据库进去操作。
前面也讲到过 ViewSet 与 TableSet 他们都继承了: DbReadSet<TSet, TEntity> 这个类
/// <summary> /// 视图操作 /// </summary> /// <typeparam name="TEntity">实体</typeparam> public sealed class ViewSet<TEntity> : DbReadSet<ViewSet<TEntity>, TEntity> where TEntity : class, new() /// <summary> /// 表操作 /// </summary> /// <typeparam name="TEntity"></typeparam> public sealed class TableSet<TEntity> : DbReadSet<TableSet<TEntity>, TEntity> where TEntity : class, new()
换句话说,他们都共同包含了 DbReadSet 提供的 方法、属性 。
在 表的数据操作 一篇中,已经讲到了如何进行操作一张表。包括了读数据、写数据这两类,而从字面理解上我们也知道了DbReadSet是为读数据提供的一个数据库操作类。
因此视图的操作,就相当于是表的 读操作 那一部份。
既然如此,那么很明显,它们的调用方式也是一样的。
静态调用方式
1 // 在查询时,进行字段筛选,否则将以*号查询 2 View.Data.Account.Select(o=>o.ID).Select(o=>new {o.UserName,o.LoginCount}); 3 // 查询或者更新时,限定条件 4 View.Data.Account.Where(o=>o.ID); 5 // 排序方式 6 View.Data.Account.Desc(o=>o.ID).Asc(o=>new {o.LoginCount,o.CreateAt}); 7 View.Data.Account.Asc(o=>o.ID);
实例化调用
1 using(var context = new View()) 2 { 3 context.Account.Select(o=>new{ o.ID, o.UserName}).Where(o=>o.ID > 0).Desc(o=>o.ID) 4 }
ViewSet提供的方法
/// <summary> 查询多条记录(不支持延迟加载) </summary> /// <param name="top">限制显示的数量</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> /// <param name="isRand">返回当前条件下随机的数据</param> public virtual DataTable ToTable(int top = 0, bool isDistinct = false, bool isRand = false) /// <summary> 查询多条记录(不支持延迟加载) </summary> /// <param name="pageSize">每页显示数量</param> /// <param name="pageIndex">分页索引</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> /// <returns></returns> public virtual DataTable ToTable(int pageSize, int pageIndex, bool isDistinct = false) /// <summary> 查询多条记录(不支持延迟加载) </summary> /// <param name="pageSize">每页显示数量</param> /// <param name="pageIndex">分页索引</param> /// <param name="recordCount">总记录数量</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> public virtual DataTable ToTable(int pageSize, int pageIndex, out int recordCount, bool isDistinct = false) /// <summary> 查询多条记录(不支持延迟加载) </summary> /// <param name="top">限制显示的数量</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> /// <param name="isRand">返回当前条件下随机的数据</param> public virtual List<TEntity> ToList(int top = 0, bool isDistinct = false, bool isRand = false) /// <summary> /// 查询多条记录(不支持延迟加载) /// </summary> /// <param name="pageSize">每页显示数量</param> /// <param name="pageIndex">分页索引</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> /// <returns></returns> public virtual List<TEntity> ToList(int pageSize, int pageIndex, bool isDistinct = false) /// <summary> /// 查询多条记录(不支持延迟加载) /// </summary> /// <param name="pageSize">每页显示数量</param> /// <param name="pageIndex">分页索引</param> /// <param name="recordCount">总记录数量</param> /// <param name="isDistinct">返回当前条件下非重复数据</param> public virtual List<TEntity> ToList(int pageSize, int pageIndex, out int recordCount, bool isDistinct = false) /// <summary> /// 返回筛选后的列表 /// </summary> /// <typeparam name="TEntity">实体类</typeparam> /// <typeparam name="T">实体类的属性</typeparam> /// <param name="select">字段选择器</param> public virtual List<T> ToSelectList<T>(Expression<Func<TEntity, T>> select) /// <summary> /// 返回筛选后的列表 /// </summary> /// <param name="top">限制显示的数量</param> /// <param name="select">字段选择器</param> /// <typeparam name="TEntity">实体类</typeparam> /// <typeparam name="T">实体类的属性</typeparam> public virtual List<T> ToSelectList<T>(int top, Expression<Func<TEntity, T>> select) /// <summary> /// 返回筛选后的列表 /// </summary> /// <param name="select">字段选择器</param> /// <param name="lstIDs">o => IDs.Contains(o.ID)</param> /// <typeparam name="TEntity">实体类</typeparam> /// <typeparam name="T">实体类的属性</typeparam> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual List<T> ToSelectList<T>(List<T> lstIDs, Expression<Func<TEntity, T>> select, string memberName = null) /// <summary> /// 返回筛选后的列表 /// </summary> /// <param name="select">字段选择器</param> /// <param name="lstIDs">o => IDs.Contains(o.ID)</param> /// <param name="top">限制显示的数量</param> /// <typeparam name="TEntity">实体类</typeparam> /// <typeparam name="T">实体类的属性</typeparam> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual List<T> ToSelectList<T>(List<T> lstIDs, int top, Expression<Func<TEntity, T>> select, string memberName = null) /// <summary> /// 查询单条记录(不支持延迟加载) /// </summary> public virtual TEntity ToEntity() /// <summary> /// 获取单条记录 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">条件,等同于:o=>o.ID.Equals(ID) 的操作</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual TEntity ToEntity<T>(T ID, string memberName = null) /// <summary> /// 查询数量(不支持延迟加载) /// </summary> public virtual int Count(bool isDistinct = false, bool isRand = false) /// <summary> /// 获取数量 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">条件,等同于:o=>o.ID.Equals(ID) 的操作</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual int Count<T>(T ID, string memberName = null) /// <summary> /// 获取数量 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="lstIDs">条件,等同于:o=> IDs.Contains(o.ID) 的操作</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual int Count<T>(List<T> lstIDs, string memberName = null) /// <summary> /// 查询数据是否存在(不支持延迟加载) /// </summary> public virtual bool IsHaving() /// <summary> /// 判断是否存在记录 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="ID">条件,等同于:o=>o.ID == ID 的操作</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual bool IsHaving<T>(T ID, string memberName = null) /// <summary> /// 判断是否存在记录 /// </summary> /// <typeparam name="T">ID</typeparam> /// <param name="lstIDs">条件,等同于:o=> IDs.Contains(o.ID) 的操作</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual bool IsHaving<T>(List<T> lstIDs, string memberName = null) /// <summary> /// 查询单个值(不支持延迟加载) /// </summary> public virtual T GetValue<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查询单个值 /// </summary> /// <typeparam name="T1">ID</typeparam> /// <typeparam name="T2">字段类型</typeparam> /// <param name="ID">条件,等同于:o=>o.ID.Equals(ID) 的操作</param> /// <param name="fieldName">筛选字段</param> /// <param name="defValue">不存在时默认值</param> /// <param name="memberName">条件字段名称,如为Null,默认为主键字段</param> public virtual T2 GetValue<T1, T2>(T1 ID, Expression<Func<TEntity, T2>> fieldName, T2 defValue = default(T2), string memberName = null) /// <summary> /// 累计和(不支持延迟加载) /// </summary> public virtual T Sum<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查询最大数(不支持延迟加载) /// </summary> public virtual T Max<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T)) /// <summary> /// 查询最小数(不支持延迟加载) /// </summary> public virtual T Min<T>(Expression<Func<TEntity, T>> fieldName, T defValue = default(T))
可以很清楚的看出,上面提供的方法均是读操作。而没有任何的写操作。同时这部份方法也是被 TableSet 支持的(又啰嗦了,照顾下新人)。
比如我们获取一条数据是:
View.Data.Account.Select(o => o.ID).Select(o => o.Name).Where(o => o.ID > 1).ToEntity();
我们获取一批数据是:
View.Data.Account.Select(o => o.ID).Select(o => o.Name).Where(o => o.ID > 0).Asc(o => o.ID).ToList();
其它的就不再举例了。大家可以自行尝试下。
总结
视图的方法,实际就是等同于表的读方法那部份,因此大家学会了表的操作之后,一样懂得如何操作视图(方法、参数一致)。
由于Farseer.net暂时未提供复杂的SQL查询功能。因此用视图来进行转化下也是一种很方便的手段。
导航
目 录: Farseer.net轻量级ORM开源框架 目录
上一篇: Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
下一篇: Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
广告时间
QQ群: 116228666 (Farseer.net开源框架交流) 请注明: Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 寓意:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是: Object (对象) Relational (关系) Mapping (映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
1 Table.Data.User.Where(o=>o.ID == 1).ToEntity(); 2 Table.Data.User.Where(o=>o.ID > 1).ToList(); 3 Table.Data.User.Where(o=>o.ID != 0).Delete(); 4 Table.Data.User.Where(o=>o.ID != 0).AddUp(o=>o.LoginCount, 1); 5 Table.Data.User.Where(o=>o.ID == 1).Update(new User{ UserName = "newName" }); 6 Table.Data.User.Insert(new User{ UserName = "newName" });