Castle.net
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>;
}
}
}