导航

目   录: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; }
}

首先,我们先创建一个实体。(数据库就不放上来了)

ChlDB实体

它继承了BaseCateModel基类。

 namespace FS.Model.Web
{
/// <summary>
/// 频道
/// </summary>
[DB(Name = "Web_ChlDB")]
public class ChlDB : BaseCateModel<ChlDB> { }
}

看到这里,大家是否觉得奇怪?怎么没有属性呢?因为我们继承了ModelCateInfo,而ModelCateInfo又继承了ModelInfo。所以ID、Caption、Sort、ParentID 都是默认支持的。因此这个类是“空”的属性。

当然。你会说,你的数据库字段的属性名不叫这个啊。别忘了。类的属性与数据库的字段的映射是通过特性来建立的。也就是说,不管你的类属性名称是什么,只要特性申明中,对应好字段名称就可以了。

并且这些父类的属性都是可重写的,因此根据你的项目选择性进行重写即可。

BaseCateModel与BaseCacheModel的区别

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轻量级开源框架 入门篇: 缓存逻辑层

下一篇: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轻量级开源框架 入门篇:分类逻辑层的更多相关文章

  1. Farseer.net轻量级开源框架 入门篇:逻辑层的选择

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 入门篇:增.删.改.查操作演示 下一篇:Farseer.net轻量级开源框架 入门 ...

  2. Farseer.net轻量级开源框架 入门篇:添加数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...

  3. Farseer.net轻量级开源框架 入门篇:使用前说明

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改. ...

  4. Farseer.net轻量级开源框架 入门篇:修改数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 ...

  5. Farseer.net轻量级开源框架 入门篇:删除数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...

  6. Farseer.net轻量级开源框架 入门篇:查询数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: Where条 ...

  7. Farseer.net轻量级开源框架 入门篇:Where条件的终极使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 下一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 ...

  8. Farseer.net轻量级开源框架 中级篇:事务的使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...

  9. Farseer.net轻量级开源框架 中级篇:动态数据库访问

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 自定义配置文件 下一篇:Farseer.net轻量级开源框架 中级篇: 数据库切换 ...

随机推荐

  1. Logstash学习系列之基础介绍

    Logstash功能特性 能集中处理各种类型的数据 能标准化不同模式和格式的数据 能快速的扩展自定义日志的格式 它具有收集,分析和转发数据流的功能 Logstash运行参数 -f 指定配置文件 -e ...

  2. 配置文件的备份和IOS 的备份

    分享到 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 开心网 腾讯朋友 百度空间 豆瓣网 搜狐微博 百度新首页 QQ收藏 和讯微博 我的淘宝 百度贴吧 更多... 百度分享 广场 登录 注册 关注此 ...

  3. cocos2dX 之数据存储

    今天我们来看cocos2dX里面的数据存储类, CCUserDefault, 如今的游戏基本都会把用户信息保存下来, 以便于再次进入游戏的时候读取, 为了方便起见,有时我们也能够用CCUserDefa ...

  4. Codeforces(429D - Tricky Function)近期点对问题

    D. Tricky Function time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. LeetCode145 Binary Tree Postorder Traversal Java题解(递归 迭代)

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given bin ...

  6. 实时人工智能:微软发布Project Brainwave预览版 现场可编程门阵列(Field Programmable Gate Array,简称FPGA) 硬件设计可以迅速演进

    https://mp.weixin.qq.com/s/bAPiPURZd-YsbV5PbzwpQQ 编者按:随着各大公司对于数据计算的要求越来越高,实时AI成为了研究者们关注的重点.在美国西雅图举行的 ...

  7. 打印二叉树中距离根节点为k的所有节点

    package tree; public class Printnodesatkdistancefromroot { /** * Given a root of a tree, and an inte ...

  8. 【167】IDL 中相关技巧

    IDL 中相关技巧 1. 注释:分号“;”表示注释内容的开始. 2. 续行:最后一个字符是“$”,那么本行将紧接着下一行,续行标志.(换行符,$+回车) 3. 中文编码:窗口>首选项>常规 ...

  9. 15_传智播客iOS视频教程_OC语言完全兼容C语言

    OC支持C语言所有的运算符并且效果是一样的.C语言中所有的运算符OC都支持.这些所有的运算符OC当中全部都支持. 包括C语言的结构体.枚举全部都可以写在OC当中,没有任何问题,并且效果是一样的. 比如 ...

  10. bzoj 4806: 炮【dp】

    同1801 注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include< ...