天天看點

一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料

  NHibernate.Linq除了本身提供了标準查詢運算符和NHibernate特有的兩個強查詢立即抓取(EagerFetching)和查詢緩存(QueryCacheable),我們也可以自己定義Linq provider擴充。

  在NHibernate中,幾乎所有的面向對象查詢語言(HQL、Criteria、QueryOver)都是可擴充的,Linq也不例外。我們可以擴充自定義LINQ-provider并将LINQ擴充方法轉換為SQL。下面看看NHibernate對外提供的Linq provider擴充機制。

  為Hql-Generators提供統一注冊接口,在Build SessionFactory的時候,NHibernate注冊提供的Hql-Generators。

  提供Hql-Generators注冊工廠,預設注冊NHibernate内置支援的NHibernate.Linq查詢,譬如DateTime類型提供的屬性和方法、String類型提供的屬性和方法、Queryable和Enumerable提供的方法。

  可以通過Configuration的"linqtohql.generatorsregistry"配置節或者Configuration類提供的LinqToHqlGeneratorsRegistry擴充方法注冊實作ILinqToHqlGeneratorsRegistry接口自定義Linq provider擴充。

  預設NHibernate内置支援的NHibernate.Linq查詢注冊類,繼承ILinqToHqlGeneratorsRegistry接口。

  對運作時方法注冊,ICollection<T>集合的Contains方法,帶LinqExtensionMethodAttribute的擴充方法。

  對方法Hql生成,譬如Queryable和Enumerable類的Any、All、Min、Max、Contains方法;string類型的StartsWith、EndsWith、Contains、Equals、ToLower、ToLowerInvariant、ToUpper、ToUpperInvariant、Substring、IndexOf、Replace方法和帶LinqExtensionMethodAttribute的擴充方法,NHibernate内部用于識别和轉換Visitors類的方法。

  對屬性Hql生成,譬如DateTime類型的Year、Month、Day、Hour、Minute、Second、Date屬性;string類型的Length屬性。NHibernate内部用于識别和轉換Visitors類的屬性。

一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料

  BaseHqlGeneratorForMethod抽象類實作IHqlGeneratorForMethod接口。用于定義方法的Hql-Generators。例如NHibernate内置提供string類型StartWith()方法的Hql-Generators實作:

一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料
一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料
一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料

  我們以String類型為例,使用IsLike擴充方法對String類型擴充,模仿SQL中的LIKE從句。

  使用IsLike擴充方法對String類型擴充,代碼如下:

  建立完擴充方法之後,就可以在記憶體中使用這個擴充了。但是我們需要NHibernate把他翻譯成持久化查詢(persistence-queries),即需要轉換為SQL。像NHibernate内置的實作類似,我們需要建立一個Generators:

  我們繼承預設NHibernate内置支援的NHibernate.Linq查詢注冊類,這樣可以把我們自定義的Hql-Generators附加進去。

  使用IsLike擴充方法去查詢DB資料,我們需要配置我們自定義的LinqToHQLGeneratorsRegistry,如果使用配置檔案配置,則需要使用linqtohql.generatorsregistry:

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

一起談.NET技術,NHibernate3.0剖析:Query篇之NHibernate.Linq自定義擴充  系列引入  概述  Linq provider自定義擴充機制  Linq provider自定義擴充實作  參考資料

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

  希望本文對你有所幫助。