• nhibernate动态查询


     ICriteria iCriteria = _SessionFactory.GetCurrentSession().CreateCriteria(typeof(Cardtype));
                if (cardtype.Cardtypeid != null)
                {
                    iCriteria.Add(Restrictions.Like("Cardtypename", "12%"));
                }
                if (cardtype.Cardtypeid != null)
                {
                    iCriteria.Add(Restrictions.Like("Cardtypename", "12%"));
                }
                if (cardtype.Cardtypeid != null)
                {
                    iCriteria.Add(Restrictions.Like("Cardtypename", "12%"));
                }
                if (cardtype.Cardtypeid != null)
                {
                    iCriteria.Add(Restrictions.Like("Cardtypename", "12%"));
                }
                //
                //string username="name";
                //var expr = PredicateBuilder.True<User>();
                //if (!string.IsNullOrEmpty(nameKeyWord))
                //{
                //   expr = expr.And(u => u.UserName.Contains(username));
                //}

                var expr = PredicateBuilder.True<Cardtype>();
                if (cardtype.Cardtypeid != null)
                {
                    expr = expr.And(u => u.Cardtypename == cardtype.Cardtypename);
                }

                _CardtypeRepository.Query().Where(expr);

    本篇学习查询及条件查询,可能大家都有点SQL基础,所以这篇文章比较简单,只是大概汇总一下NHibernate的查询方式,而且多数都是引用李永京老师的博库,如果你想看更详细的,请访问李永京老师的博客。

        首先是NHibernate最基本的查询方式:以ISession的CreateQuery方法创建SQL语句,返回相应数据,因为是SQL,这里只简单列举几个查询, 其他的自己下去操作下就行了。

        下面的_session和入门2里面的QueryHql.cs一致。

        查询Customer所有数据:_session.CreateQuery("from Customer").List<Customer>();

        返回多个对象或属性/字段:return _session.CreateQuery("select c.FirstName, count(c.FirstName) from Customer c group by c.FirstName").List<object[]>();

           注意这里返回的是List<OBJECT[]>

        返回单一字段:return _session.CreateQuery("select c.CustomerId from Customer c").List<int>();

           注意返回类型,这里CustomerId 是INT类型,所以返回List<int>();

        根据条件返回:

        有以下3种写法,第一种大家都明白,但容易注入,第二种和第三种和.NET中的STRING.FORMAT差不多。

    代码
            public IList<Customer> GetCustomersByFirstname(string firstname)
            {
                
    //写法1,会注入
                
    //return _session.CreateQuery("from Customer c where c.Firstname='" + firstname + "'")
                
    //    .List<Customer>();

                
    //写法2:位置型参数
                
    //return _session.CreateQuery("from Customer c where c.Firstname=?")
                
    //    .SetString(0, firstname)
                
    //    .List<Customer>();

                
    //写法3:命名型参数(推荐)
                return _session.CreateQuery("from Customer c where c.FirstName=:fn").SetString("fn", firstname).List<Customer>();
            }

       

        以上是最基本的查询,都和SQL一致,这里不多讲解。下面就是NHibernate的Criteria来实现条件查询

        Criteria简单的说就是把根据你设置好的表达式来返回数据,还是看代码,这样直观:

       

    代码
    public IList<Customer> CreateCriteria()
    {
        ICriteria crit 
    = _session.CreateCriteria(typeof(Customer));
        crit.SetMaxResults(
    50);
        IList
    <Customer> customers = crit.List<Customer>();
        
    return customers;
    }

        首先使用ISession接口的CreateCriteria方法创建了NHibernate.ICriteria接口一个特定的持久化类的查询实例,其中typeof(Customer) 是实例名,第二条代码是设置返回50条数据集合,可以理解为TOP 50

     

        接下来是用ADD添加一个Restrictions类中的约束表达式,Restrictions中提供大量的常用约束,或者直观的说是条件:

    代码
    public IList<Customer> Narrowing()
    {
        IList
    <Customer> customers = _session.CreateCriteria(typeof(Customer))
            .Add(Restrictions.Like(
    "Firstname""YJing%"))
            .Add(Restrictions.Between(
    "Lastname""A%""Y%"))
            .List
    <Customer>();
        
    return customers;
    }

        以上可以直观的看出LIKE是模糊查询,Between是取其中间值,Restrictions还包含更多约束,如IN/AND/OR==,大家自己可以操作看看。

        再就是排序,使用Criterion.Order进行排序,其中true为ASC(升序),false为desc(降序):

       

    代码
    public IList<Customer> Order()
    {
        
    return _session.CreateCriteria(typeof(Customer))
            .Add(Restrictions.Like(
    "Firstname","Y%"))
            .AddOrder(
    new NHibernate.Criterion.Order("Firstname"false))
            .AddOrder(
    new NHibernate.Criterion.Order("Lastname"true))
            .List
    <Customer>();
    }

        还有一个Example类,可以根据你指定的实例创造查询条件,可以理解为自定义查询条件:

       

    代码
    public IList<Customer> Query()
    {
        Customer customerSample 
    = new Customer() { Firstname = "YJing", Lastname = "Lee" };
        
    return _session.CreateCriteria(typeof(Customer))
            .Add(Example.Create(customerSample))
            .List
    <Customer>();
    }

        先创建个customerSample实例,用.Add(Example.Create(customerSample))添加,最后会根据Example和设置NHibernate返回其对象集合。

        这篇文章极其简单,因为个人觉得没什么可讲的,除非你没学过T-SQL。

        这次讲的是查询,下次讲非查询额和事务。源代码这次就不上了。

  • 相关阅读:
    Spring+JCaptcha验证码使用示例
    Hibernate-Session使用的背后
    DWR+Spring配置使用
    Spring+Quartz配置定时任务
    利用HtmlParser解析网页内容
    利用HttpClient4访问网页
    利用Common-Fileupload上传文件图片
    利用Common-BeanUtils封装请求参数
    浮点数的一点东西
    基数排序——浮点数结构体进阶
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2357086.html
Copyright © 2020-2023  润新知