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

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

  系列引入

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

  概述

  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<T>集合的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<Expression> 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<MyLinqToHqlGeneratorsRegistry>();

  5.使用IsLike擴展方法

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

  6.執行結果

Linq-IsLikeExtensions  結語

  通過這篇文章學習了Linq provider自定義擴展機制和實現。

  參考資料

  Fabio Maulo:NHibernate LINQ provider extension

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

  希望本文對你有所幫助。

NET技術NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴展,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人永久免费视频 | 久久综合中文字幕佐佐木希 | 成人做视频免费 | 快播电影官方网站 | 伊人久久大香线蕉综合网站 | wwwzzz日本| 国产三级精品三级在线观看 | 一本之道高清www在线观看 | 野花韩国高清完整版在线 | 亚洲精品视频在线观看免费 | 国产美女一区二区 | 久久国产精品免费A片蜜芽 久久国产精品萌白酱免费 久久国产精品麻豆AV影视 | 秋霞伦理电影在2017韩国在线伦 | 久久久97人妻无码精品蜜桃 | 欧美麻豆一精品一AV一免费 | 国产成人精品视频免费大全 | 高清国产在线观看 | 和姐姐做插得很深 | 麻豆久久国产亚洲精品超碰热 | 精品无码一区二区三区中文字幕 | xxxxxx视频 | bbw videos 欧美老妇 | 欧美性xxx免费看片 欧美性xxx极品 | 国产乱色伦影片在线观看 | 日本久久久免费高清 | 99久久久久精品国产免费麻豆 | 抽插H浊水H嫩B父皇 虫族bl文全肉高h | 成年人视频在线免费看 | 蜜桃狠狠色伊人亚洲综合网站 | 青草影院内射中出高潮-百度 | 亚洲精品高清AV在线播放 | 一品道门在线视频高清完整版 | asian4you裸模| 国产在线观看不卡 | 亚洲 视频 在线 国产 精品 | 哇嘎在线精品视频在线观看 | 国产精品网红女主播久久久 | 色狠狠一区二区 | 亚洲免费在线视频观看 | 在线中文字幕亚洲日韩 | 亚洲 无码 制服 日韩 |