zoukankan      html  css  js  c++  java
  • 使用NHibernate(5)-- Linq To NHibernate

    Linq是NHibernate所支持的查询语言之一,对于Linq的实现在源码的src/Linq目录下。以下是一个使用Linq进行查询数据的示例:

    var users = session.Query<User>().where(n=>n.Id=5).OrderBy(n=>n.Name).ToList();

    session在我们跑起来的第一个程序的Controller中已经介绍过了,它是查询数据库的入口;通过调用其泛型方法Query,可以拿到相应的集合,然后通过where方法进行条件过滤,通过OrderBy进行排序;注意到此为止,NHibernate并没有去查询数据库,而是调用ToList的方法的时候才去访问数据库,这就是延迟查询,即用到某个数据的时候NHi才回去查询。对于延迟查询的使用和原理分析,打算后面再讨论。

    Nhibernate3.3对Linq的支持已经非常好了,实现了几乎所有的Linq接口,下面是Linq to Nhibernate 所支持的方法:

    聚合方法:

    Count、Sum 、Min、Max、Average

    转换方法:

    ToArray, ToList, ToDictionary, OfType

    单个查询:

    First, FirstOrDefault, ElementAt

    生成:

    Range,Repeat

    分组:

    GroupBy

    连接:

    Cross, Group, Left Outer

    排序:

    OrderBy, OrderByDescending, ThenBy, ThenByDescending, Reverse

    分区查询:

    Take,Skip,TakeWhile,SkipWhile

    投影运算符:

    Select ,SelectMany

    限量运算:

    Select ,SelectMany

    条件:

    Where

    集合:

    Distinct, Union, Intersect, Except

    下面演示如何通过Linq to NHibernate进行分页查询:

    var count = session.Query<User>().Count();

    var users = session.Query<User>().OrderBy(n=>n.name).Skip((pageIndex-1)*pageSize).Take(pageSize).ToList();

    首先对用户进行排序,然后跳过(pageIndex-1)*pageSize条数据,最后Take。

    上述代码会和数据库有两次交互,第一次是查询总数即count ,第二次是查询分页数据。如果想在一次交互中执行上述两条sql,则可以用NHibernate特有的Futre查询,代码修改如下:

    var count = session.Query<User>().Count().ToFuture();

    var users = session.Query<User>().OrderBy(n=>n.name).Skip((pageIndex-1)*pageSize).Take(pageSize).ToFuture().ToList();

    虽然数据的增删改跟Linq无关,但也打算在这里提一下,感觉这样就可以进行CRUD了。

    插入数据:

    User user = new User(){Name="FuzhePan"};
    session.Save(user );

    保存后,user的主键就已经有值了。

    修改数据:

    Session.Update(user);

    删除数据:

    Session.Delete(user);

    注意:数据增删改之后,如果开启了事务,需要提交事务,数据才会被持久化到数据库中。

  • 相关阅读:
    虚拟机网络模型详解,看这篇就够了(图文并茂)
    快速理解 VirtualBox 的四种网络连接方式
    Linux下桥接模式详解一
    CentOS7 下VNC Server远程桌面配置详解
    BAN如何下载?
    SNS交换机(OEM博科FC交换机)怎样设置密码策略
    SNS交换机(OEM博科FC交换机)的端口状态及排查流程说明
    SNS2124(OEM博科FC交换机)忘记密码,密码初始化
    博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)
    手淫让我付出了沉重的代价
  • 原文地址:https://www.cnblogs.com/FuzhePan/p/3652099.html
Copyright © 2011-2022 走看看