博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nhibernate动态查询
阅读量:7241 次
发布时间:2019-06-29

本文共 3623 字,大约阅读时间需要 12 分钟。

 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差不多。

ExpandedBlockStart.gif
代码
        
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简单的说就是把根据你设置好的表达式来返回数据,还是看代码,这样直观:

   

ExpandedBlockStart.gif
代码
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中提供大量的常用约束,或者直观的说是条件:

ExpandedBlockStart.gif
代码
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(降序):

   

ExpandedBlockStart.gif
代码
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类,可以根据你指定的实例创造查询条件,可以理解为自定义查询条件:

   

ExpandedBlockStart.gif
代码
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。

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

 

转载地址:http://phybm.baihongyu.com/

你可能感兴趣的文章
How Tomcat Works(七)
查看>>
烟大 2239: 十进制与八进制的转换(栈和队列)
查看>>
hdu 4681(枚举+dp)
查看>>
Parallel Decision Tree
查看>>
iPhone较为基础的代码片段
查看>>
SED入门
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
Mule消息路由
查看>>
[Asp.Net]状态管理(ViewState、Cookie)
查看>>
马哥 Linux运维基础进阶和shell入门
查看>>
RotateDisp – 一键旋转显示画面 - 小众软件
查看>>
C# Json处理日期和Table
查看>>
addEventListener、attachEvent、cancelBubble兼容性随笔
查看>>
JS编写日历控件(支持单日历 双日历 甚至多日历等)
查看>>
400操作 示例
查看>>
交换机、集线器、路由器区别(转)
查看>>
UITextField,UITextView字数限制
查看>>
Spring 循环依赖
查看>>
sencha touch 在线实战培训 第一期 第二节
查看>>
Mirror--使用证书配置镜像模板
查看>>