导航

目   录: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. 使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体server笔记(十)

    第十部分 -- 开发板測试 前几天已经分别将nginx和ffmpeg移植到了开发板上面.可是还是没有进行不论什么的測试并不知道移植后的效果怎样. 今天分别做了两个測试.证明移植的结果是可用的. 1.測 ...

  2. Linux改动/etc/profile配置错误command is not found自救方法

    我的CSDN博客地址: http://blog.csdn.net/caicongyang 博主之前在改动了/etc/profile配置文件方法后,导致bash命令无法用 运行ls命令结果例如以下: - ...

  3. boost::mpl::eval_if的使用方法

    近期看boost的时候总是遇见这个eval_if,不知道啥意思,就没法看下去了,比方 前篇文章boost::serialization 拆分serialize函数分析时就出现这样一段代码: templ ...

  4. 简单区分iphone和ipad的宏定义

    在公共头文件里作例如以下定义: #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 使用时: if( IS_I ...

  5. Python数据导入

    1.csv格式数据导入 import pandas as pd w=pd.read.csv("数据地址") w.describe() w.sort_values(by=" ...

  6. 【Android】自己定义View

    翻译自:http://developer.android.com/training/custom-views/index.html 一)创建view类 一个设计良好的自己定义view与其它的类一样.它 ...

  7. BestCoder Round #56/hdu5463 Clarke and minecraft 水题

    Clarke and minecraft 问题描述 克拉克是一名人格分裂患者.某一天,克拉克分裂成了一个游戏玩家,玩起了minecraft.渐渐地,克拉克建起了一座城堡. 有一天,克拉克为了让更多的人 ...

  8. 局部优化与整体效果 新增时间>节省时间 权衡利弊

    原代码 from selenium import webdriverimport requests,timeurl_l=[]with open('DISTINCT_url.txt', 'r', enc ...

  9. ASP.NET Core开发Docker部署

    ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细 ...

  10. Shell 通配符、元字符、转义符*****

    说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: 1   1 2 3 4 [chengmo@localhost ~/shell]$ ls a.txt  b.txt  ...