Farseer.net轻量级开源框架 入门篇:分类逻辑层
上一篇:Farseer.net轻量级开源框架 入门篇: 缓存逻辑层
下一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解
分类逻辑层,主要用在一些需要支持无限递归的树数据。树数据是:必须有一个根节点,根节点有无限个子节点,没有节点限制。比如我们常用的有:(频道、xxx分类)
这里与BaseCacheModel的操作是完全一致。唯一不同的是,BaseCateModel是继承自ModelCateInfo。这个类提供了默认的几个字段:
/// <summary>
/// 分类基类
/// </summary>
public class ModelCateInfo : ModelInfo
{
/// <summary>
/// 所属ID
/// </summary>
[Display(Name = "所属分类")]
public virtual int? ParentID { get; set; } /// <summary>
/// 标题
/// </summary>
[Display(Name = "标题"), StringLength(), Required]
public virtual string Caption { get; set; } /// <summary>
/// 排序
/// </summary>
[Display(Name = "排序")]
public virtual int? Sort { get; set; }
}
首先,我们先创建一个实体。(数据库就不放上来了)
它继承了BaseCateModel基类。
namespace FS.Model.Web
{
/// <summary>
/// 频道
/// </summary>
[DB(Name = "Web_ChlDB")]
public class ChlDB : BaseCateModel<ChlDB> { }
}
看到这里,大家是否觉得奇怪?怎么没有属性呢?因为我们继承了ModelCateInfo,而ModelCateInfo又继承了ModelInfo。所以ID、Caption、Sort、ParentID 都是默认支持的。因此这个类是“空”的属性。
当然。你会说,你的数据库字段的属性名不叫这个啊。别忘了。类的属性与数据库的字段的映射是通过特性来建立的。也就是说,不管你的类属性名称是什么,只要特性申明中,对应好字段名称就可以了。
并且这些父类的属性都是可重写的,因此根据你的项目选择性进行重写即可。
BaseCacheModel有的功能,BaseCateModel都有
BaseCateModel在这个基础下扩展了一系列针对“树”的操作。(扩展方法的命名空间:using FS.Extend)
扩展方法提供了一系列上下级节点的搜索方法。比如查询父级、顶级、下级等等操作。当然里面的方法有很多。具体大家在:FS.Extend.ListExtend 类中查看。
它是在 对象名.Cache() 下的扩展,也就是说是在:List<实体类> 并且 实体类是继承BaseCateModel 的 如图:
/// <summary>
/// Cate扩展工具
/// </summary>
public static partial class ListExtend
{
/// <summary>
/// 获取指定ParentID的ID列表
/// </summary>
/// <param name="isContainsSub">是否获取子节点</param>
/// <param name="ID">上级ID</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<int> GetSubIDList<TInfo>(this List<TInfo> lstCate, int? ID, bool isContainsSub = true, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取指定ParentID的ID列表
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isContainsSub">是否获取子节点</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<int> GetSubIDList<TInfo>(this List<TInfo> lstCate, string caption, bool isContainsSub = true, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取指定ParentID的ID列表
/// </summary>
/// <param name="ID">上级ID</param>
/// <param name="isContainsSub">是否获取子节点</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<TInfo> GetSubList<TInfo>(this List<TInfo> lstCate, int? ID, bool isContainsSub = true, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取指定ParentID的ID列表
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isContainsSub">是否获取子节点</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<TInfo> GetSubList<TInfo>(this List<TInfo> lstCate, string caption, bool isContainsSub = true, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 通过标题,获取分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isNullAdd">true:不存在则自动创建</param>
/// <param name="lstCate">分类列表</param>
public static int GetID<TInfo>(this List<TInfo> lstCate, string caption, bool isNullAdd = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 通过标题,获取分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isNullAdd">true:不存在则自动创建</param>
/// <param name="lstCate">分类列表</param>
public static TInfo GetInfo<TInfo>(this List<TInfo> lstCate, string caption, bool isNullAdd = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取根节点分类数据
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="lstCate">分类列表</param>
public static int GetFirstID<TInfo>(this List<TInfo> lstCate, int? ID) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取根节点分类数据
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="lstCate">分类列表</param>
public static TInfo GetFirstInfo<TInfo>(this List<TInfo> lstCate, int? ID) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取根节点分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="lstCate">分类列表</param>
public static int GetFirstID<TInfo>(this List<TInfo> lstCate, string caption) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取根节点分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="lstCate">分类列表</param>
public static TInfo GetFirstInfo<TInfo>(this List<TInfo> lstCate, string caption) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取上一级分类数据
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="lstCate">分类列表</param>
public static int GetParentID<TInfo>(this List<TInfo> lstCate, int? ID) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取上一级分类数据
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="lstCate">分类列表</param>
public static TInfo GetParentInfo<TInfo>(this List<TInfo> lstCate, int? ID) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取上一级分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="lstCate">分类列表</param>
public static int GetParentID<TInfo>(this List<TInfo> lstCate, string caption) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取上一级分类数据
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="lstCate">分类列表</param>
public static TInfo GetParentInfo<TInfo>(this List<TInfo> lstCate, string caption) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取所有上级分类数据(从第一级往下排序)
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<int> GetParentIDList<TInfo>(this List<TInfo> lstCate, int? ID, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取所有上级分类数据(从第一级往下排序)
/// </summary>
/// <param name="ID">当前分类数据ID</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<TInfo> GetParentList<TInfo>(this List<TInfo> lstCate, int? ID, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取所有上级分类数据(从第一级往下排序)
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<int> GetParentIDList<TInfo>(this List<TInfo> lstCate, string caption, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 获取所有上级分类数据(从第一级往下排序)
/// </summary>
/// <param name="caption">分类标题</param>
/// <param name="isAddMySelf">是否添加自己</param>
/// <param name="lstCate">分类列表</param>
public static List<TInfo> GetParentList<TInfo>(this List<TInfo> lstCate, string caption, bool isAddMySelf = false) where TInfo : ModelCateInfo, new(); /// <summary>
/// 绑定到DropDownList
/// </summary>
/// <param name="ddl">要绑定的ddl控件</param>
/// <param name="selectedValue">默认选则值</param>
/// <param name="parentID">所属上级节点</param>
/// <param name="isUsePrefix">是否需要加上前缀</param>
/// <param name="lstCate">分类列表</param>
public static void Bind<TInfo>(this List<TInfo> lstCate, DropDownList ddl, int selectedValue, int parentID, bool isUsePrefix = true) where TInfo : ModelCateInfo, new(); /// <summary>
/// 绑定到DropDownList
/// </summary>
/// <param name="ddl">要绑定的ddl控件</param>
/// <param name="selectedValue">默认选则值</param>
/// <param name="where">筛选条件</param>
/// <param name="isContainsSub">筛选条件是否包含子节点</param>
/// <param name="isUsePrefix">是否需要加上前缀</param>
/// <param name="lstCate">分类列表</param>
public static void Bind<TInfo>(this List<TInfo> lstCate, DropDownList ddl, int selectedValue = , Func<TInfo, bool> where = null, bool isContainsSub = false, bool isUsePrefix = true) where TInfo : ModelCateInfo, new(); /// <summary>
/// 递归绑定
/// </summary>
private static void Bind<TInfo>(this List<TInfo> lstCate, DropDownList ddl, int parentID, int tagNum, Func<TInfo, bool> where, bool isContainsSub, bool isUsePrefix) where TInfo : ModelCateInfo, new();
}
这篇基本上都介绍了BaseCateModel的使用。
相对于BaseCacheModel,增加了额外对“树”数据结构的操作。
上一篇:Farseer.net轻量级开源框架 入门篇: 缓存逻辑层
下一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 意为:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
new User { ID = , Name = "张三" }.Insert()
Farseer.net轻量级开源框架 入门篇:分类逻辑层的更多相关文章
- Farseer.net轻量级开源框架 入门篇:逻辑层的选择
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 入门篇:增.删.改.查操作演示 下一篇:Farseer.net轻量级开源框架 入门 ...
- Farseer.net轻量级开源框架 入门篇:添加数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...
- Farseer.net轻量级开源框架 入门篇:使用前说明
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改. ...
- Farseer.net轻量级开源框架 入门篇:修改数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...
- Farseer.net轻量级开源框架 入门篇:删除数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...
- Farseer.net轻量级开源框架 入门篇:查询数据详解
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...
- Farseer.net轻量级开源框架 入门篇:Where条件的终极使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 ...
- Farseer.net轻量级开源框架 中级篇:事务的使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...
- Farseer.net轻量级开源框架 中级篇:动态数据库访问
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...
随机推荐
- Lua:ipairs和pairs的区别
ipairs 和pairs在lua中都是遍历tbale的函数但是两者有区别 1.pairs遍历table中的所有的key-vale 而ipairs会根据key的数值从1开始加1递增遍历对应的table ...
- firewalld 防火墙 nat 网络地址转换
目的:实现以下效果 一. 准备环境 @1 三台虚拟机 @2 client 端 ip 192.168.1.2 server端 两块网卡 , ip 分别是 192.168.1.1 和 ...
- 通过构建Cocoapods私有库进行组件化开发探索
专题一 一.创建私有索引库 选Github或者码云都可以,本例以Github为例.创建私有索引库用来作为自己组件库的索引: 二.本地添加私有索引库 添加:pod repo add 索引库名称 索引库地 ...
- [swift实战入门]手把手教你编写2048(一)
苹果设备越来越普及,拿着个手机就想捣鼓点啥,于是乎就有了这个系列,会一步一步教大家学习swift编程,学会自己做一个自己的app,github地址:https://github.com/scarlet ...
- ZOJ问题(2010浙江大学研究生复试上机题目[找规律] hdoj 3788)
ZOJ问题 pid=3788">点击打开链接 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- MySQL系列:innodb源代码分析之内存管理
在innodb中实现了自己的内存池系统和内存堆分配系统,在innodb的内存管理系统中,大致分为三个部分:基础的内存块分配管理.内存伙伴分配器和内存堆分配器.innodb定义和实现内存池的主要目的是提 ...
- 制作NGUI动态字体
在ngui中有两种制做字体的方式.一种是bmfont等工具制作字体图集的方法,这样的方法呢是动态的.生成的图集有多个字就是多少个字,要多加一 个字要又一次用工具做一次,非常是麻烦. 而汉字有太多,我们 ...
- 在C++代码中调用L脚本语言
L脚本语言同意被其他编程语言调用.如C++,非常easy.仅仅要在宿主语言中载入L脚本引擎的动态库 直接调用这两个函数就能够了 extern "C" int __stdcall S ...
- 复合页( Compound Page )
复合页(Compound Page)就是将物理上连续的两个或多个页看成一个 独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage). 也能够用来创建透明大页( ...
- [计算机]如何在win7下查看并更改文件的默认后缀名
如何在win7下查看默认文件的后缀名并更改呢? 例如有一个文件本来是exe,想变更为txt.但是无法看到后缀名,就无法更改. 双击桌面上的计算机图标,或者任意盘符界面,单击如下图左侧“组织”右侧的下拉 ...