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>;
}
}
}
Castle.net的更多相关文章
- Castle Core 4.0.0 alpha001发布
时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...
- 对Castle Windsor的Resolve方法的解析时new对象的探讨
依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...
- AOP之Castle DynamicProxy 动态代理
这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- MVC Castle依赖注入实现代码
1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...
- 避免Castle Windsor引起的内存泄露
原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...
- Castle中AdditionalInterfaces用法介绍
首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...
- Castle.ActiveRecord多数据库配置
最近使用Castle.ActiveRecord框架,网上关于多数据支持的文章很少,因此有了这篇博文的产生. 开发工具VS2015,Sql Server2008R2 新建数据库,数据初始化脚本如下: - ...
- Castle Windsor常用介绍以及其在ABP项目的应用介绍
最近在研究ABP项目,有关ABP的介绍请看阳光铭睿 博客,ABP的DI和AOP框架用的是Castle Windsor下面就对Castle Windsor项目常用方法介绍和关于ABP的使用总结 1.下载 ...
- 基于Autofac, Castle.DynamicProxy的动态WCF解决方案(原创)
本方案解决了下面3个主要的问题: 1.减少配置,为了避免每次新增service都需要去修改配置文件,包括服务器端跟各个客户端的. 2.能够使用函数重载,泛型函数,以及泛型类. 3.使项目能够快速地在w ...
随机推荐
- TCO 2016 Round 1B
problem 250 Problem Statement Vasa likes to construct sequences of numbers. If you tell him a positi ...
- MYSQL初级学习笔记一:MYSQL常用命令和数据库操作(DDL)!(视频序号:初级_3,4)
知识点一:MYSQL常用命令(3) 登入方法:一,mysql –u 账号 –p 密码 退出方法:一,EXIT,QUIT 修改MYSQL命令提示符: 连接上客户机之后,通常使用prompt命令修改: 连 ...
- DGA聚类 使用DBScan
features = sc.parallelize(data_group[idx]).map(lambda x: (x.host_ip+'^'+x.domain, 1)).reduceByKey(op ...
- HTTPS站点搭建教程:Win7/Windows Server 2008R2
本文将由笔者为各位读者介绍在win7/windows server 2008R2环境下使用SSL加密协议建立WWW站点的全过程:https SSL证书安装的搭建以及本地测试环境. 要想成功架设SSL安 ...
- codevs3955最长严格上升子序列
传送门 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列 ...
- http://www.cnblogs.com/Javame/p/3632473.html
http://www.cnblogs.com/Javame/p/3632473.html
- LIS LCS LCIS (主要过一遍,重在做题)
只详细讲解LCS和LCIS,别的不讲-做题优先. 菜鸟能力有限写不了题解,可以留评论,我给你找博客. 先得理解最长上升子序列吧,那个HDOJ拦截导弹系列可以做一下,然后用o(n)log(n)的在做一遍 ...
- bzoj 1396: 识别子串【SAM+线段树】
建个SAM,符合要求的串显然是|right|==1的节点多代表的串,设si[i]为right集合大小,p[i]为right最大的r点,这些都可以建出SAM后再parent树上求得 然后对弈si[i]= ...
- bzoj 1823: [JSOI2010]满汉全席【2-SAT+tarjan】
因为每种食材只有一份,所以两个评委的如果有要求同一种食材的两种做法就是不可行,用这个来建立2-SAT模型 然后跑tarjan判可行性即可 #include<iostream> #inclu ...
- bzoj 1396: 识别子串 && bzoj 2865: 字符串识别【后缀数组+线段树】
根据height数组的定义,和当前后缀串i最长的相同串的长度就是max(height[i],height[i+1]),这个后缀贡献的最短不同串长度就是len=max(height[i],height[ ...