天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴(kuò)展

  系列引入

  NHibernate3.0剖析系列分別從Configuration篇、Mapping篇、Query篇、Session策略篇、應(yīng)用篇等方面全面揭示NHibernate3.0新特性和應(yīng)用及其各種應(yīng)用程序的集成,基于NHibernte3.0版本。如果你還不熟悉NHibernate,可以快速閱讀NHibernate之旅系列文章導(dǎo)航系列入門,如果你已經(jīng)在用NHibernate了,那么請(qǐng)跟上NHibernate3.0剖析系列吧。

  概述

  NHibernate.Linq除了本身提供了標(biāo)準(zhǔn)查詢運(yùn)算符和NHibernate特有的兩個(gè)強(qiáng)查詢立即抓取(EagerFetching)和查詢緩存(QueryCacheable),我們也可以自己定義Linq provider擴(kuò)展。

  Linq provider自定義擴(kuò)展機(jī)制

  在NHibernate中,幾乎所有的面向?qū)ο蟛樵冋Z言(HQL、Criteria、QueryOver)都是可擴(kuò)展的,Linq也不例外。我們可以擴(kuò)展自定義LINQ-provider并將LINQ擴(kuò)展方法轉(zhuǎn)換為SQL。下面看看NHibernate對(duì)外提供的Linq provider擴(kuò)展機(jī)制。

  ILinqToHqlGeneratorsRegistry接口

  為Hql-Generators提供統(tǒng)一注冊(cè)接口,在Build SessionFactory的時(shí)候,NHibernate注冊(cè)提供的Hql-Generators。

  LinqToHqlGeneratorsRegistryFactory注冊(cè)工廠

  提供Hql-Generators注冊(cè)工廠,默認(rèn)注冊(cè)NHibernate內(nèi)置支持的NHibernate.Linq查詢,譬如DateTime類型提供的屬性和方法、String類型提供的屬性和方法、Queryable和Enumerable提供的方法。

  可以通過Configuration的"linqtohql.generatorsregistry"配置節(jié)或者Configuration類提供的LinqToHqlGeneratorsRegistry擴(kuò)展方法注冊(cè)實(shí)現(xiàn)ILinqToHqlGeneratorsRegistry接口自定義Linq provider擴(kuò)展。

  DefaultLinqToHqlGeneratorsRegistry注冊(cè)類

  默認(rèn)NHibernate內(nèi)置支持的NHibernate.Linq查詢注冊(cè)類,繼承ILinqToHqlGeneratorsRegistry接口。

  三種Hql-Generators接口:

  IRuntimeMethodHqlGenerator

  對(duì)運(yùn)行時(shí)方法注冊(cè),ICollection<T>集合的Contains方法,帶LinqExtensionMethodAttribute的擴(kuò)展方法。

  IHqlGeneratorForMethod

  對(duì)方法Hql生成,譬如Queryable和Enumerable類的Any、All、Min、Max、Contains方法;string類型的StartsWith、EndsWith、Contains、Equals、ToLower、ToLowerInvariant、ToUpper、ToUpperInvariant、Substring、IndexOf、Replace方法和帶LinqExtensionMethodAttribute的擴(kuò)展方法,NHibernate內(nèi)部用于識(shí)別和轉(zhuǎn)換Visitors類的方法。

  IHqlGeneratorForProperty

  對(duì)屬性Hql生成,譬如DateTime類型的Year、Month、Day、Hour、Minute、Second、Date屬性;string類型的Length屬性。NHibernate內(nèi)部用于識(shí)別和轉(zhuǎn)換Visitors類的屬性。

  兩種Hql-Generators抽象類:

  BaseHqlGeneratorForMethod

Linq-BaseHqlGeneratorForMethod

  BaseHqlGeneratorForMethod抽象類實(shí)現(xiàn)IHqlGeneratorForMethod接口。用于定義方法的Hql-Generators。例如NHibernate內(nèi)置提供string類型StartWith()方法的Hql-Generators實(shí)現(xiàn):

Linq-StartsWithGenerator  BaseHqlGeneratorForProperty

Linq-BaseHqlGeneratorForProperty  BaseHqlGeneratorForProperty抽象類實(shí)現(xiàn)IHqlGeneratorForProperty接口。用于定義屬性的Hql-Generators。例如NHibernate內(nèi)置提供string類型Length屬性的Hql-Generators實(shí)現(xiàn):

Linq-LengthGenerator  知道了上面的內(nèi)容,相信你可以自定義一個(gè)Linq provider擴(kuò)展了。

  Linq provider自定義擴(kuò)展實(shí)現(xiàn)

  我們以String類型為例,使用IsLike擴(kuò)展方法對(duì)String類型擴(kuò)展,模仿SQL中的LIKE從句。

  1.Linq擴(kuò)展方法

  使用IsLike擴(kuò)展方法對(duì)String類型擴(kuò)展,代碼如下:

//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擴(kuò)展方法的Hql-Generators實(shí)現(xiàn)

  創(chuàng)建完擴(kuò)展方法之后,就可以在內(nèi)存中使用這個(gè)擴(kuò)展了。但是我們需要NHibernate把他翻譯成持久化查詢(persistence-queries),即需要轉(zhuǎn)換為SQL。像NHibernate內(nèi)置的實(shí)現(xiàn)類似,我們需要?jiǎng)?chuàng)建一個(gè)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<Expression> arguments, HqlTreeBuilder treeBuilder, IHqlExpressionVisitor visitor)
{
return treeBuilder.Like(visitor.Visit(arguments[0]).AsExpression(),
visitor.Visit(arguments[1]).AsExpression());
}
}

  3.注冊(cè)IsLike擴(kuò)展方法Hql-Generators

  我們繼承默認(rèn)NHibernate內(nèi)置支持的NHibernate.Linq查詢注冊(cè)類,這樣可以把我們自定義的Hql-Generators附加進(jìn)去。

//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擴(kuò)展

  使用IsLike擴(kuò)展方法去查詢DB數(shù)據(jù),我們需要配置我們自定義的LinqToHQLGeneratorsRegistry,如果使用配置文件配置,則需要使用linqtohql.generatorsregistry:

  如果使用Loquacious-configuration就是這樣:

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

  5.使用IsLike擴(kuò)展方法

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

  6.執(zhí)行結(jié)果

Linq-IsLikeExtensions  結(jié)語

  通過這篇文章學(xué)習(xí)了Linq provider自定義擴(kuò)展機(jī)制和實(shí)現(xiàn)。

  參考資料

  Fabio Maulo:NHibernate LINQ provider extension

  NHibernate Jira: Add support for user-provided extensions to the Linq provider

  希望本文對(duì)你有所幫助。

NET技術(shù)NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴(kuò)展,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久99re热在线观看视频 | 久久亚洲欧美国产综合 | 国产久久re6免费热在线 | 久久精品热在线观看85 | 秋霞电影网午夜免费鲁丝片 | 中文文字幕文字幕亚洲色 | jiucao在线观看精品 | 一个人免费视频在线观看 | 男人把女人桶到爽免费看视频 | 极品少妇粉嫩小泬啪啪AV | 久久精品亚洲AV中文2区金莲 | 999zyz色资源站在线观看 | 一级做a爰片久久毛片一 | 亚洲国产在线午夜视频无 | 久久精品黄AA片一区二区三区 | 国产AV电影区二区三区曰曰骚网 | 色欲人妻无码AV精品一区二区 | 成人久久欧美日韩一区二区三区 | 羞羞答答dc视频 | 亚洲国产精品久久又爽黄A片 | 国产中文字幕乱码一区 | 久久中文字幕无码A片不卡 久久中文字幕人妻熟AV女蜜柚M | 国产成人无码区免费内射一片色欲 | 久久中文字幕免费高清 | 亚洲 欧洲 国产 日产 综合 | 正在播放国产尾随丝袜美女 | 亚洲在线视频自拍精品 | WWW国产亚洲精品久久久日本 | 伊人网青青草 | 国产午夜人做人免费视频中文 | 亚洲成人在线免费观看 | 黄页网站18以下勿看免费 | 伦理 电影在线观看百度影音 | 亚洲视频999| 边做边爱播放3免费观看 | 四虎亚洲中文字幕永久在线 | 干丝袜美女 | beeg xxx日本老师 | 俄罗斯美女破处 | 青青青青久久久久国产的 | 妈妈的职业3完整版在线播放 |