技术开发 频道

NH剖析:Query篇之NHibernate.Linq查询

      【IT168 技术文档】NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略篇、应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本。如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧。

  •   NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/
  •   NHibernate官方站点:http://nhforge.org/
  •   NHibernate参考文档:http://nhforge.org/doc/nh/en/
  •   获取NHibernate地址:http://sourceforge.net/projects/nhibernate/

  NHibernate.Linq概述

  NHibernate.Linq基于HQL AST分析器的Linq Provider,由Steve Strong贡献者开发的,底层使用第三方Re-Linq开源框架。所以NHibernate3.0多了一个必需程序集:Remotion.Data.Linq.dll。

  注意:在之前NHibernate版本中并不存在Linq功能,Ayende Rahien贡献者为NHibernate2.1.0GA和NHibernate2.1.2GA版本设计第三方NHiberante.Linq.dll(对应为NHibernate.Linq-1.0.0.GA-bin.zip和NHibernate.Linq-2.1.2-GA-Bin.zip)(目前已经停止了维护),它是基于Criteria API的Linq Provider,主要功能是将简单的Linq表达式转化为Criteria API,由于Criteria API的功能有限,所以存在很多天生的不足(联接和子查询不支持)。如果使用NHibernate2.1.0GA或者NHibernate2.1.2GA版本可以下载使用NHiberante.Linq.dll,在这里不作介绍。下面看看NHibernate提供的全新的NHibernate.Linq查询。

  我们使用ISession接口的Query()扩展方法创建一个NHibernate.Linq查询。

1

  首先需要using NHibernate.Linq命名空间,然后使用ISession.Query()获得IQueryable,我们对其做一些延迟操作(例如where、orderby等),最后使用不延迟的操作(例如ToList()、Count()、FirstOrDefault())返回需要的结果。

  注意,NHibernate.Linq查询将Linq运算符转换为HQL,有些Linq运算符本身是专门处理集合的,而SQL主要是在处理无序值集。所以NHibernate.Linq查询肯定不需要支持这些专门处理集合的运算符,例如Except、Intersect、转换运算符、生成运算符等。

  下面列举所有Linq运算符和说明,并列举了一些简单的NHibernate.Linq查询,我仅仅对单一对象User对象操作:

//Code Snippets Copyright http://lyj.cnblogs.com/
public class User
{
    
public Guid Id { get; set; }
    
public string Name { get; set; }
    
public int Age { get; set; }
}

 

  标准查询运算符

  1.基本形式

  使用ISession的Query(),然后ToList()查询出所有的User对象。

//Code Snippets Copyright http://lyj.cnblogs.com/
var basicquery
= (from user in session.Query<User>()
                  
select user).ToList();

var basicquery2
= session.Query<User>().ToList();

 

  2.限制运算符

  •   Where:筛选序列中的项目

  说明:对属性值一些筛选,筛选属性支持组件、枚举、各种关联、支持基本类型的方法。例如Int等类型的等于、大于、小于,不等于;String类型的StartsWith、EndsWith、Contains、Equals、ToLower、ToLowerInvariant、ToUpper、ToUpperInvariant、Substring、IndexOf等;DateTime的Year、Date、Month等。也可以在Where运算符中使用聚合操作符的子查询。

//Code Snippets Copyright http://lyj.cnblogs.com/
var restrictionquery
= (from user in session.Query<User>()
                  where user.Name
== "李永京"
                  
select user).ToList();

var restrictionquery2
= session.Query<User>().Where(o => o.Name == "李永京").ToList();

 

  3.投影运算符

  •   Select:创建部分序列的投影
  •   SelectMany:创建部分序列的一对多投影

  说明:Select运算符对于大多数操作都支持,也支持子查询,但是不支持嵌套Select。SelectMany不支持。

//Code Snippets Copyright http://lyj.cnblogs.com/
var selectAnonymousquery
= (from user in session.Query<User>()
                            
select new {user.Name, Age = user.Age}).ToList();

var selectAnonymousquery2
= session.Query<User>()
    .Select(o
=> new {o.Name, Age = o.Age})
    .ToList();
0
相关文章