架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 21266|回复: 0

[资料] c#之NHibernate帮助类

[复制链接]
发表于 2016-7-12 11:12:14 | 显示全部楼层 |阅读模式
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NHibernate;
  6. using NHibernate.Criterion;
  7. using System.Linq.Expressions;
  8. using Project.Common;
  9. using NHibernate.Type;
  10. using NHibernate.Linq;
  11. using System.Data;
  12. using System.Reflection;

  13. namespace Project.Dal.Base
  14. {
  15.         public class Repository<T> : IRepository<T> where T : class
  16.         {
  17.                 private static LinqOrder<T>[] emptyLinqOrderCollection;
  18.                 private Type type = typeof(T);

  19.                 /// <summary>
  20.                 /// NHibernate Session 对象
  21.                 /// </summary>
  22.                 private ISession session;
  23.                 public ISession Session
  24.                 {
  25.                         get
  26.                         {
  27.                                 session = NHibernateHelper.SessionFactory.GetCurrentSession();
  28.                                 return session;
  29.                         }
  30.                 }


  31.                 #region IRepository<T> Members

  32.                 public Repository()
  33.                 {

  34.                 }

  35.                 public virtual void Inject()
  36.                 {
  37.                         InjectDalObject.Inject(this);
  38.                 }

  39.                 public virtual object Save(T entity)
  40.                 {
  41.                         return Session.Save(entity);
  42.                        
  43.                 }

  44.                 public virtual void Update(T entity)
  45.                 {
  46.                         Session.Update(entity);
  47.                 }

  48.                 public virtual object SaveOrUpdate(T entity)
  49.                 {
  50.                         var classMetadata = NHibernateHelper.SessionFactory.GetClassMetadata(typeof(T).ToString());
  51.                         var property = typeof(T).GetProperty(classMetadata.IdentifierPropertyName);
  52.                         Session.SaveOrUpdate(entity);
  53.                         return property.GetValue(entity, null);
  54.                 }

  55.                 public virtual void Delete(T entity)
  56.                 {
  57.                         Session.Delete(entity);
  58.                 }

  59.                 public virtual T Merge(T entity)
  60.                 {
  61.                         return (T)Session.Merge(entity);
  62.                 }

  63.                 public virtual void Persist(T entity)
  64.                 {
  65.                         Session.Persist(entity);
  66.                 }

  67.                 public virtual T GetByID(object id)
  68.                 {
  69.                         return Session.Get<T>(id);
  70.                 }

  71.                 /// <summary>
  72.                 ///
  73.                 /// </summary>
  74.                 /// <typeparam name="T"></typeparam>
  75.                 /// <param name="id"></param>
  76.                 /// <param name="nullableType"></param>
  77.                 public virtual int DeleteByID(object id)
  78.                 {
  79.                         var classMetadata = NHibernateHelper.SessionFactory.GetClassMetadata(typeof(T).ToString());
  80.                         var queryString = string.Format("delete {0} where {1} = :{1}",
  81.                                                                    typeof(T), classMetadata.IdentifierPropertyName);
  82.                         int result = session.CreateQuery(queryString)
  83.                                         .SetParameter(classMetadata.IdentifierPropertyName, id)
  84.                                         .ExecuteUpdate();
  85.                         return result;
  86.                 }

  87.                 /// <summary>
  88.                 /// 分页查询表T 数据,单条件排序
  89.                 /// </summary>
  90.                 /// <param name="pageSize"></param>
  91.                 /// <param name="pageIndex"></param>
  92.                 /// <param name="count"></param>
  93.                 /// <param name="path"></param>
  94.                 /// <param name="direction"></param>
  95.                 /// <returns></returns>
  96.                 public virtual IList<T> PaginateList(int pageSize, int pageIndex, ref int count, Expression<Func<T, object>> path, EnumOrder? direction)
  97.                 {
  98.                         LinqOrder<T>[] orderCollection = null;
  99.                         orderCollection = path == null ? emptyLinqOrderCollection : (new LinqOrder<T>[] { new LinqOrder<T>() { Direction = direction ?? EnumOrder.ASC, Path = path } });
  100.                         return PaginateListBy(pageSize, pageIndex, ref count, null, orderCollection);
  101.                 }

  102.                 /// <summary>
  103.                 /// 分页查询表T 数据,并多条件查询
  104.                 /// </summary>
  105.                 /// <param name="pageSize"></param>
  106.                 /// <param name="pageIndex"></param>
  107.                 /// <param name="count"></param>
  108.                 /// <param name="orderCollection"></param>
  109.                 /// <returns></returns>
  110.                 public virtual IList<T> PaginateList(int pageSize, int pageIndex, ref int count, params LinqOrder<T>[] orderCollection)
  111.                 {
  112.                         return PaginateListBy(pageSize, pageIndex, ref count, null, orderCollection);
  113.                 }

  114.                 /// <summary>
  115.                 /// 分页查询表T 数据
  116.                 /// </summary>
  117.                 /// <param name="pageSize"></param>
  118.                 /// <param name="pageIndex"></param>
  119.                 /// <param name="count"></param>
  120.                 /// <returns></returns>
  121.                 public virtual IList<T> PaginateList(int pageSize, int pageIndex, ref int count)
  122.                 {
  123.                         return PaginateListBy(pageSize, pageIndex, ref count, null);
  124.                 }

  125.                 /// <summary>
  126.                 /// 分页查询表T,并进行筛选,单条件排序
  127.                 /// </summary>
  128.                 /// <param name="pageSize"></param>
  129.                 /// <param name="pageIndex"></param>
  130.                 /// <param name="count"></param>
  131.                 /// <param name="criteria"></param>
  132.                 /// <param name="path"></param>
  133.                 /// <param name="direction"></param>
  134.                 /// <returns></returns>
  135.                 public virtual IList<T> PaginateListBy(int pageSize, int pageIndex, ref int count, Expression<Func<T, bool>> criteria, Expression<Func<T, object>> path, EnumOrder direction)
  136.                 {
  137.                         LinqOrder<T>[] orderCollection = null;
  138.                         orderCollection = path == null ? emptyLinqOrderCollection : (new LinqOrder<T>[] { new LinqOrder<T>() { Direction = direction, Path = path } });
  139.                         return PaginateListBy(pageSize, pageIndex, ref count, criteria, orderCollection);
  140.                 }

  141.                 /// <summary>
  142.                 /// 分页查询表T,并进行筛选。
  143.                 /// </summary>
  144.                 /// <param name="pageSize"></param>
  145.                 /// <param name="pageIndex"></param>
  146.                 /// <param name="count"></param>
  147.                 /// <param name="criteria"></param>
  148.                 /// <param name="path"></param>
  149.                 /// <param name="direction"></param>
  150.                 /// <returns></returns>
  151.                 public virtual IList<T> PaginateListBy(int pageSize, int pageIndex, ref int count, Expression<Func<T, bool>> criteria)
  152.                 {
  153.                         return PaginateListBy(pageSize, pageIndex, ref count, criteria, null);
  154.                 }


  155.                 /// <summary>
  156.                 /// 分页查询表T,并进行筛选,多条件排序
  157.                 /// </summary>
  158.                 /// <param name="pageSize"></param>
  159.                 /// <param name="pageIndex"></param>
  160.                 /// <param name="count"></param>
  161.                 /// <param name="criteria"></param>
  162.                 /// <param name="orderCollection"></param>
  163.                 /// <returns></returns>
  164.                 public virtual IList<T> PaginateListBy(int pageSize, int pageIndex, ref int count, Expression<Func<T, bool>> criteria, params LinqOrder<T>[] orderCollection)
  165.                 {
  166.                         IList<T> list = null;
  167.                         IQueryable<T> query = Session.Query<T>();
  168.                         if (criteria != null)
  169.                                 query = query.Where(criteria);

  170.                         /* 添加排序条件
  171.                         ----------------------------------------------------------*/
  172.                         query = AttachOrders(query, orderCollection);

  173.                         /* 查询出记录总数
  174.                         ----------------------------------------------------------*/
  175.                         count = criteria == null ? Session.Query<T>().Count() : Session.Query<T>().Where(criteria).Count();

  176.                         /* 如果pageIndex超出总页数,则按照最后一页查询
  177.                         ----------------------------------------------------------*/
  178.                         int pages = (int)Math.Ceiling(count / (double)pageSize);
  179.                         pageIndex = pageIndex > (pages - 1) ? 0 : pageIndex;


  180.                         /* 进行分页查询
  181.                         ----------------------------------------------------------*/
  182.                         list = query.Skip((pageIndex) * pageSize).Take(pageSize).ToList();

  183.                         return list;
  184.                 }


  185.                 /// <summary>
  186.                 /// 返回表T 所有数据
  187.                 /// </summary>
  188.                 /// <param name="orderCollection"></param>
  189.                 /// <returns></returns>
  190.                 public virtual IList<T> List(params LinqOrder<T>[] orderCollection)
  191.                 {
  192.                         return ListBy(null, orderCollection);
  193.                 }

  194.                 /// <summary>
  195.                 /// 返回表T 所有数据
  196.                 /// </summary>
  197.                 /// <param name="path">排序字段</param>
  198.                 /// <param name="direction">排序方向</param>
  199.                 /// <returns></returns>
  200.                 public virtual IList<T> List(Expression<Func<T, object>> path, EnumOrder direction)
  201.                 {
  202.                         LinqOrder<T>[] orderCollection = null;
  203.                         orderCollection = path == null ? emptyLinqOrderCollection : (new LinqOrder<T>[] { new LinqOrder<T>() { Direction = direction, Path = path } });
  204.                         return ListBy(null, orderCollection);
  205.                 }

  206.                 /// <summary>
  207.                 /// 返回表T 所有数据
  208.                 /// </summary>
  209.                 /// <returns></returns>
  210.                 public IList<T> List()
  211.                 {
  212.                         return ListBy(null, null);
  213.                 }

  214.                 /// <summary>
  215.                 /// 根据条件,查询表T 数据
  216.                 /// </summary>
  217.                 /// <param name="criteria"></param>
  218.                 /// <returns></returns>
  219.                 public virtual IList<T> ListBy(Expression<Func<T, bool>> criteria)
  220.                 {
  221.                         return ListBy(criteria, null);
  222.                 }

  223.                 /// <summary>
  224.                 /// 根据条件,查询表T 数据,并进行单排序
  225.                 /// </summary>
  226.                 /// <param name="criteria"></param>
  227.                 /// <param name="path"></param>
  228.                 /// <param name="direction"></param>
  229.                 /// <returns></returns>
  230.                 public virtual IList<T> ListBy(Expression<Func<T, bool>> criteria, Expression<Func<T, object>> path, EnumOrder direction)
  231.                 {
  232.                         LinqOrder<T>[] orderCollection = null;
  233.                         orderCollection = path == null ? emptyLinqOrderCollection : (new LinqOrder<T>[] { new LinqOrder<T>() { Direction = direction, Path = path } });
  234.                         return ListBy(criteria, orderCollection);
  235.                 }

  236.                 /// <summary>
  237.                 /// 根据条件,查询表T 数据,并进行多排序
  238.                 /// </summary>
  239.                 /// <param name="criteria"></param>
  240.                 /// <param name="orderCollection"></param>
  241.                 /// <returns></returns>
  242.                 public virtual IList<T> ListBy(Expression<Func<T, bool>> criteria, params LinqOrder<T>[] orderCollection)
  243.                 {
  244.                         IQueryable<T> query = Session.Query<T>();
  245.                         if (criteria != null)
  246.                                 query = query.Where(criteria);
  247.                         //添加排序条件
  248.                         query = AttachOrders(query, orderCollection);
  249.                         return query.ToList();
  250.                 }

  251.                 /// <summary>
  252.                 /// 筛选,列出前Top纪录,多条件排序
  253.                 /// </summary>
  254.                 /// <param name="criteria"></param>
  255.                 /// <param name="count"></param>
  256.                 /// <param name="orderCollection"></param>
  257.                 /// <returns></returns>
  258.                 public virtual IList<T> ListTopX(Expression<Func<T, bool>> criteria, int count, params LinqOrder<T>[] orderCollection)
  259.                 {
  260.                         IQueryable<T> query = Session.Query<T>();
  261.                         if (criteria != null)
  262.                                 query = query.Where(criteria);
  263.                         //添加排序条件
  264.                         query = AttachOrders(query, orderCollection);
  265.                         return query.Take(count).ToList();
  266.                 }

  267.                 /// <summary>
  268.                 /// 筛选,列出前Top纪录,单条件排序
  269.                 /// </summary>
  270.                 /// <param name="criteria"></param>
  271.                 /// <param name="count"></param>
  272.                 /// <param name="path"></param>
  273.                 /// <param name="direction"></param>
  274.                 /// <returns></returns>
  275.                 public virtual IList<T> ListTopX(Expression<Func<T, bool>> criteria, int count, Expression<Func<T, object>> path, EnumOrder direction)
  276.                 {
  277.                         LinqOrder<T>[] orderCollection = null;
  278.                         orderCollection = path == null ? emptyLinqOrderCollection : (new LinqOrder<T>[] { new LinqOrder<T>() { Direction = direction, Path = path } });
  279.                         return ListTopX(criteria, count, orderCollection);
  280.                 }

  281.                 /// <summary>
  282.                 /// 筛选,列出前Top纪录。
  283.                 /// </summary>
  284.                 /// <param name="criteria"></param>
  285.                 /// <param name="count"></param>
  286.                 /// <returns></returns>
  287.                 public virtual IList<T> ListTopX(Expression<Func<T, bool>> criteria, int count)
  288.                 {
  289.                         return ListTopX(criteria, count, null);
  290.                 }

  291.                 /// <summary>
  292.                 /// 获得表总记录数
  293.                 /// </summary>
  294.                 /// <returns></returns>
  295.                 public virtual int Count()
  296.                 {
  297.                         return Session.Query<T>().Count();
  298.                 }

  299.                 /// <summary>
  300.                 /// 根据条件获得总记录数
  301.                 /// </summary>
  302.                 /// <param name="criteria"></param>
  303.                 /// <returns></returns>
  304.                 public virtual int CountBy(Expression<Func<T, bool>> criteria)
  305.                 {
  306.                         return Session.Query<T>().Where(criteria).Count();
  307.                 }

  308.                 /// <summary>
  309.                 /// 获得第一条数据对象
  310.                 /// </summary>
  311.                 /// <param name="criteria"></param>
  312.                 /// <returns></returns>
  313.                 public T GetFirst(Expression<Func<T, bool>> criteria)
  314.                 {
  315.                         var list = ListTopX(criteria, 1, null);
  316.                         if (list.Count > 0)
  317.                                 return list[0];
  318.                         return null;
  319.                 }

  320.                 /// <summary>
  321.                 /// 获得第一条数据对象,单条件排序
  322.                 /// </summary>
  323.                 /// <param name="criteria"></param>
  324.                 /// <param name="path"></param>
  325.                 /// <param name="direction"></param>
  326.                 /// <returns></returns>
  327.                 public T GetFirst(Expression<Func<T, bool>> criteria, Expression<Func<T, object>> path, EnumOrder direction)
  328.                 {
  329.                         var list = ListTopX(criteria, 1, path, direction);
  330.                         if (list.Count > 0)
  331.                                 return list[0];
  332.                         return null;
  333.                 }

  334.                 /// <summary>
  335.                 /// 获得第一条数据对象,单条件排序
  336.                 /// </summary>
  337.                 /// <param name="path"></param>
  338.                 /// <param name="direction"></param>
  339.                 /// <returns></returns>
  340.                 public T GetFirst(Expression<Func<T, object>> path, EnumOrder direction)
  341.                 {
  342.                         var list = ListTopX(null, 1, path, direction);
  343.                         if (list.Count > 0)
  344.                                 return list[0];
  345.                         return null;
  346.                 }

  347.                 /// <summary>
  348.                 /// 获得第一条数据对象,多条件排序
  349.                 /// </summary>
  350.                 /// <param name="criteria"></param>
  351.                 /// <param name="orderCollection"></param>
  352.                 /// <returns></returns>
  353.                 public T GetFirst(Expression<Func<T, bool>> criteria, params LinqOrder<T>[] orderCollection)
  354.                 {
  355.                         var list = ListTopX(criteria, 1, orderCollection);
  356.                         if (list.Count > 0)
  357.                                 return list[0];
  358.                         return null;
  359.                 }

  360.                 /// <summary>
  361.                 /// 获得表第一条记录
  362.                 /// </summary>
  363.                 /// <returns></returns>
  364.                 public T GetFirst()
  365.                 {
  366.                         var list = List();
  367.                         if (list.Count > 0)
  368.                                 return list[0];
  369.                         return null;
  370.                 }

  371.                 #endregion


  372.                 /// <summary>
  373.                 /// 排序条件添加
  374.                 /// </summary>
  375.                 /// <param name="query"></param>
  376.                 /// <param name="orderCollection"></param>
  377.                 /// <returns></returns>
  378.                 private IQueryable<T> AttachOrders(IQueryable<T> query, LinqOrder<T>[] orderCollection)
  379.                 {
  380.                         if (orderCollection == null || orderCollection.Count() == 0)
  381.                                 return query;
  382.                         for (int i = 0; i < orderCollection.Length; i++)
  383.                         {
  384.                                 if (orderCollection[i].Direction == EnumOrder.ASC)
  385.                                         query = query.OrderBy(orderCollection[i].Path);
  386.                                 else
  387.                                         query = query.OrderByDescending(orderCollection[i].Path);
  388.                         }
  389.                         return query;
  390.                 }
  391.         }
  392. }
复制代码






上一篇:Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture
下一篇:C# where用法解析
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-7-12 17:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表