using System;

using System.Collections.Generic;

using System.Linq;
using System.Text;
using Castle.ActiveRecord;
using NHibernate.Criterion;
using System.ComponentModel.DataAnnotations;
using NHibernate;

namespace Model
{
/// <summary>
/// 实体类基类,所有实体必须继承自EntityBase(为了被ORM框架管理)
/// </summary>
/// <typeparam name="T">子类的类型,如:Driver,Users</typeparam>
public class EntityBase<T>:ActiveRecordBase where T:class
{
[PrimaryKey(PrimaryKeyType.Identity)]//采用Castle.Net提供的算法生成ID
[Display(AutoGenerateField = false)]//在生成MVC3.0视图时不生成本属性
public virtual int ID { get; set; }//主键

public void Create(T t)
{
ActiveRecordBase.Create(t);
}

public void Update(T t)
{
ActiveRecordBase.Update(t);
}

public void DeleteAll()//删除所有数据
{
DeleteAll(typeof(T));
}

public void Delete(int id)//根据id删除实体
{
T t = Get(id);//根据id获取对象
if (t != null)//如果对象存在
{
Delete(t);//删除它
}
}

public IList<T> GetAll()//获取所有对象
{
return FindAll(typeof(T)) as IList<T>;
}

public IList<T> GetAll(IList<ICriterion> queryConditions)//根据查询条件集合获取所有对象
{
Array arr = FindAll(typeof(T));//Castle.net默认是数组
return arr as IList<T>;//将数组转换为IList集合
}

public T Get(int ID)//根据ID获取对象
{
return FindByPrimaryKey(typeof(T), ID) as T;
}

//分页区和取对象集合
public IList<T> GetPaged(IList<ICriterion> queryConditions, IList<Order> orderList, int pageIndex, int pageSize, out int count)
{
if (queryConditions == null)//如果为null则赋值为一个总数为0的集合
{
queryConditions = new List<ICriterion>();
}
if (orderList == null)//如果为null则赋值为一个总数为0的集合
{
orderList = new List<Order>();
}
count = Count(typeof(T), queryConditions.ToArray());//根据查询条件获取满足条件的对象总数
Array arr = SlicedFindAll(typeof(T), (pageIndex - 1) * pageSize, pageSize, orderList.ToArray(),queryConditions.ToArray());//根据查询条件分页获取对象集合
return arr as IList<T>;
}

/// <summary>
/// 根据查询条件分页获取实体
/// </summary>
/// <param name="queryConditions">查询条件集合</param>
/// <param name="pageIndex">当前页码,从1开始</param>
/// <param name="pageSize">页面大小</param>
/// <param name="count">返回满足查询条件</param>
/// <returns>返回满足查询条件的实体</returns>
public IList<T> GetPaged(IList<KeyValuePair<string, string>> queryConditions, int pageIndex, int pageSize, out int count)
{
//实例化一个hql查询语句对象
StringBuilder hql = new StringBuilder(@"from " + typeof(T).Name + " d");
//根据查询条件构造hql查询语句
for (int i = 0; i < queryConditions.Count; i++)
{
KeyValuePair<string, string> keyv = queryConditions[i];//获取当前序号对应的条件
if (!string.IsNullOrEmpty(keyv.Value))
{
AddHqlSatements(hql);//增加where或and语句
hql.Append("d." + keyv.Key + " = : q_" + i.ToString());
}
}

ISession session = ActiveRecordBase.holder.CreateSession(typeof(T));//获取管理DeliveryForm的session对象
IQuery query = session.CreateQuery(hql.ToString());//获取满足条件的数据
IQuery queryScalar = session.CreateQuery("select count(ID) " + hql.ToString());//获取满足条件的数据的总数
for (int i = 0; i < queryConditions.Count; i++)
{
KeyValuePair<string, string> keyv = queryConditions[i];//获取当前序号对应的条件
if (!string.IsNullOrEmpty(keyv.Value))
{
queryScalar.SetString("q_" + i, keyv.Value);//用查询条件的值去填充hql,如d.Transportor.Name="michael"
query.SetString("q_" + i, keyv.Value);
}
}
IList<object> result = queryScalar.List<object>();//执行查询条件总数的查询对象,返回一个集合(有一点怪异)
int.TryParse(result[0].ToString(), out count);//尝试将返回值的第一个值转换为整形,并将转换成功的值赋值给count,如果转换失败,count=0
query.SetFirstResult((pageIndex - 1) * pageSize);//设置获取满足条件实体的起点
query.SetMaxResults(pageSize);//设置获取满足条件实体的终点
IList<T> arr = query.List<T>();//返回当前页的数据
session.Close();//关闭session
return arr;
}

protected void AddHqlSatements(StringBuilder hql)
{
if (!hql.ToString().Contains("where"))//查询语句的开始条件是where
{
hql.Append(" where ");
}
else//当hql中有了一个where后再添加查询条件时就应该使用and了
{
hql.Append(" and ");
}
}

public IList<T> Find(IList<ICriterion> queryConditions)
{
Array arr = ActiveRecordBase.FindAll(typeof(T), queryConditions.ToArray());
return arr as IList<T>;
}
}
}

Castle.net的更多相关文章

  1. Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...

  2. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

  3. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  4. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  5. MVC Castle依赖注入实现代码

    1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...

  6. 避免Castle Windsor引起的内存泄露

    原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...

  7. Castle中AdditionalInterfaces用法介绍

    首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...

  8. Castle.ActiveRecord多数据库配置

    最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...

  9. Castle Windsor常用介绍以及其在ABP项目的应用介绍

    最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...

  10. 基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)

    本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在w ...

随机推荐

  1. HTML canvas

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  2. php composer 相关及版本约束等小技巧

    对于现代语言而言,包管理器基本上是标配.Java有Maven,Python有pip,Ruby有gem,Nodejs有npm.PHP的则是PEAR,不过PEAR坑不少: 依赖处理容易出问题 配置非常复杂 ...

  3. rails用generate为两个模型创建has_and_belongs_to_many中间表

    假设 teachers和students具备many-to-many的关系,那么需要一个Join 表,has_and_belongs_to_many默认该表名字为teachers_students,这 ...

  4. 如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条

    需要两个缓存 key名称 phone-busy,缓存1分钟 key名称 phone-send-count,缓存1天,每成功发送一条+1 发送的时候流程如下: 判断phone-busy是否存在,存在直接 ...

  5. MYSQL初级学习笔记四:查询数据的操作DQL(SELECT基本形式)(26-35)

    知识点六:查询数据的操作DQL(SELECT基本形式)(26-35) CREATE DATABASE IF NOT EXISTS cms DEFAULT CHARACTER SET utf8; USE ...

  6. 一个点亮屏幕的service

    这个版本是只能点亮不能解锁的版本(注意很多句子都被注释掉了,那部分是用来实现解锁屏幕的),达到了预期的效果,特此纪念. 把代码贴出来: package com.larry.msglighter; im ...

  7. [POI 2014] Couriers

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3524 [算法] 首先离线 , 将询问按右端点排序 如果我们知道[l , r]这个区间 ...

  8. HDU 1270 小希的数表 (暴力枚举+数学)

    题意:... 析:我们可以知道,a1+a2=b1,那么我们可以枚举a1,那么a2就有了,并且a1+a3=b2,所以a3就有了,我们再从把里面的剩下的数两两相加,并从b数组中去掉, 那么剩下的最小的就是 ...

  9. emacs版本差异(转载)

    emacs23 就是原装的,由 gnu 发布的 emacs.emacs-lucid 是由 ubuntu 调整过的.emacs-nox 是不带 x system 的 emacs 版本.除非只在终端下用, ...

  10. shell脚本只提供整数算术运算(三种方式)—((表达式))、let "表达式"、value=`expr 表达式右边` (转载)

    转自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201131055455754/ 数值运算: 在bash中只提供了整数运算,一 ...