• 选学校
  • 高中毕后选择什么学校好
  • 启蒙星
  • 北大青鸟课程介绍
  • 北大青鸟助你走上高级软件工程师修炼之路
  • 转行不是梦,学北大青鸟IT培训
  • 北大青鸟辉煌12年
  • 株洲北大青鸟校区升级

您现在的位置:株洲北大青鸟 >> >> 师资力量>> 技术天地

师资力量
开班信息
输入姓名手机号码预约试听课程
姓  名:*
手机号:*
创业摇篮班
开班日期:10月15日
招生人数:25
就业直通班
开班日期:10月31日
招生人数:25
就业精英班
开班日期:9月13日
招生人数:已满
技术天地
  • NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展
  • 〖不上名牌大学,就读株洲北大青鸟〗 发布人:株洲北大青鸟
  • 发表日期:2013/5/15 10:05:14 阅读数:98  
  •  
  •   系列引入

      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特有的两个强查询立即抓取(EagerFetching)和查询缓存(QueryCacheable),我们也可以自己定义Linq provider扩展。

      Linq provider自定义扩展机制

      在NHibernate中,几乎所有的面向对象查询语言(HQL、Criteria、QueryOver)都是可扩展的,Linq也不例外。我们可以扩展自定义LINQ-provider并将LINQ扩展方法转换为SQL。下面看看NHibernate对外提供的Linq provider扩展机制。

      ILinqToHqlGeneratorsRegistry接口

      为Hql-Generators提供统一注册接口,在Build SessionFactory的时候,NHibernate注册提供的Hql-Generators。

      LinqToHqlGeneratorsRegistryFactory注册工厂

      提供Hql-Generators注册工厂,默认注册NHibernate内置支持的NHibernate.Linq查询,譬如DateTime类型提供的属性和方法、String类型提供的属性和方法、Queryable和Enumerable提供的方法。

      可以通过Configuration的"linqtohql.generatorsregistry"配置节或者Configuration类提供的LinqToHqlGeneratorsRegistry扩展方法注册实现ILinqToHqlGeneratorsRegistry接口自定义Linq provider扩展。

      DefaultLinqToHqlGeneratorsRegistry注册类

      默认NHibernate内置支持的NHibernate.Linq查询注册类,继承ILinqToHqlGeneratorsRegistry接口。

      三种Hql-Generators接口:

      IRuntimeMethodHqlGenerator

      对运行时方法注册,ICollection集合的Contains方法,带LinqExtensionMethodAttribute的扩展方法。

      IHqlGeneratorForMethod

      对方法Hql生成,譬如Queryable和Enumerable类的Any、All、Min、Max、Contains方法;string类型的StartsWith、EndsWith、Contains、Equals、ToLower、ToLowerInvariant、ToUpper、ToUpperInvariant、Substring、IndexOf、Replace方法和带LinqExtensionMethodAttribute的扩展方法,NHibernate内部用于识别和转换Visitors类的方法。

      IHqlGeneratorForProperty

      对属性Hql生成,譬如DateTime类型的Year、Month、Day、Hour、Minute、Second、Date属性;string类型的Length属性。NHibernate内部用于识别和转换Visitors类的属性。

      两种Hql-Generators抽象类:

      BaseHqlGeneratorForMethod

      

    Linq-BaseHqlGeneratorForMethod

     

      BaseHqlGeneratorForMethod抽象类实现IHqlGeneratorForMethod接口。用于定义方法的Hql-Generators。例如NHibernate内置提供string类型StartWith()方法的Hql-Generators实现:

      

    Linq-StartsWithGenerator
      BaseHqlGeneratorForProperty

      

    Linq-BaseHqlGeneratorForProperty
      BaseHqlGeneratorForProperty抽象类实现IHqlGeneratorForProperty接口。用于定义属性的Hql-Generators。例如NHibernate内置提供string类型Length属性的Hql-Generators实现:

      

    Linq-LengthGenerator
      知道了上面的内容,相信你可以自定义一个Linq provider扩展了。

      Linq provider自定义扩展实现

      我们以String类型为例,使用IsLike扩展方法对String类型扩展,模仿SQL中的LIKE从句。

      1.Linq扩展方法

      使用IsLike扩展方法对String类型扩展,代码如下:

      //Code Snippets Copyright http://lyj.cnblogs.com/public static class MyLinqExtensions{ public static bool IsLike(this string source, string pattern) { pattern = Regex.Escape(pattern); pattern = pattern.Replace("%", ".*?").Replace("_", "."); pattern = pattern.Replace(@"\[", "[").Replace(@"\]","]").Replace(@"\^", "^"); return Regex.IsMatch(source, pattern); }}

      2.IsLike扩展方法的Hql-Generators实现

      创建完扩展方法之后,就可以在内存中使用这个扩展了。但是我们需要NHibernate把他翻译成持久化查询(persistence-queries),即需要转换为SQL。像NHibernate内置的实现类似,我们需要创建一个Generators:

      //Code Snippets Copyright http://lyj.cnblogs.com/public class IsLikeGenerator : BaseHqlGeneratorForMethod{ public IsLikeGenerator() { SupportedMethods = new[] {ReflectionHelper.GetMethodDefinition(() => MyLinqExtensions.IsLike(null, null))}; } public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor) { return treeBuilder.Like(visitor.Visit(arguments[0]).AsExpression(), visitor.Visit(arguments[1]).AsExpression()); }}

      3.注册IsLike扩展方法Hql-Generators

      我们继承默认NHibernate内置支持的NHibernate.Linq查询注册类,这样可以把我们自定义的Hql-Generators附加进去。

      //Code Snippets Copyright http://lyj.cnblogs.com/public class MyLinqToHqlGeneratorsRegistry: DefaultLinqToHqlGeneratorsRegistry{ public MyLinqToHqlGeneratorsRegistry() { RegisterGenerator(ReflectionHelper.GetMethodDefinition( () => MyLinqExtensions.IsLike(null, null)),new IsLikeGenerator()); }}

      4.配置自定义Linq provider扩展

      使用IsLike扩展方法去查询DB数据,我们需要配置我们自定义的LinqToHQLGeneratorsRegistry,如果使用配置文件配置,则需要使用linqtohql.generatorsregistry:

      如果使用Loquacious-configuration就是这样:

      //Code Snippets Copyright http://lyj.cnblogs.com/configuration.LinqToHqlGeneratorsRegistry();

      5.使用IsLike扩展方法

      //Code Snippets Copyright http://lyj.cnblogs.com/var users = session.Query().Where(o => o.Name.IsLike("%永京%")).ToList();

      6.执行结果

      

    Linq-IsLikeExtensions
上一篇:自定义委托和事件实现窗体数据同步更新
下一篇:大型高并发高负载网站的系统架构
分享到:

版权所有 ©株洲健坤科技职业培训学校    学校地址:株洲市天元区黄山路205号健坤大厦(天元区消防中队对面)

咨询报名热线:400-8812-866    邮箱地址:4008812866@b.qq.com   备案号: 湘ICP备10202015号  

北大青鸟学费是多少 湖南北大青鸟怎么样
株洲北大青鸟好不好 株洲北大青鸟学费多少 株洲北大青鸟学校这么样
秒速时时彩官方网站