如何更簡單實(shí)現(xiàn)自定義LINQ提供器
工欲善其事,必先利其器。這個(gè)道理不論是傳統(tǒng)的制造業(yè)還是如今的軟件開發(fā)業(yè),都是放之于四海皆準(zhǔn)的道理。就拿自定義LINQ提供器來說吧,如今的發(fā)展也是如新月異。
隨著.NET 3.5的正式發(fā)布,自定義LINQ提供器的實(shí)現(xiàn)如雨后春筍般不斷涌現(xiàn)。而要開發(fā)自己的自定義LINQ提供器還是需要花費(fèi)一定的精力的,但Mehfuz Hossain通過他的開源項(xiàng)目——LinqExtender,讓大家可以輕松的開發(fā)自己的自定義LINQ提供器。
Mehfuz Hossain在他的LinqExtender介紹文章中,對(duì)LinqExtender作了這樣的介紹:
LinqExtender暴露了如下這樣一個(gè)模型,讓開發(fā)人員當(dāng)創(chuàng)建一個(gè)自定義提供器的只用關(guān)注于應(yīng)用程序邏輯,而不是查詢的內(nèi)部機(jī)理。它位于自定義LINQ框架和自定義提供器之間。
LinqExtender幫助我們完成了大量表達(dá)式解析和處理的工作,這樣,我們無需借助Reflection這樣的函數(shù)庫就能實(shí)現(xiàn)自己的自定義LINQ提供器。
LinqExtender主要提供了2個(gè)基類來幫助開發(fā)自定義LINQ提供器:QueryObjectBase和Query。
Mehfuz Hossain為了介紹LinqExtender的用法,還給出了一個(gè)簡單自定義LINQ提供器實(shí)現(xiàn)——OpenLinqToSql。OpenLinqToSql的基本實(shí)現(xiàn)如下:
實(shí)體類需要繼承于QueryObjectBase基類:
- class Book : QueryObjectBase
- {
- [LinqVisible, Identity]
- public int? Id { get; set; }
- [LinqVisible]
- public string Author { get; set; }
- [LinqVisible]
- public string Title { get; set; }
- [LinqVisible]
- public string ISBN { get; set; }
- [LinqVisible]
- public DateTime? LastUpdated {get; set;}
- public override bool IsNew
- {
- get
- {
- return Id == null;
- }
- }
- }
自定義LINQ提供器的核心類,需要繼承于Query基類:
- public class SqlQuery : Query where T : QueryObjectBase
- {
- ....
- ....
- }
要實(shí)現(xiàn)對(duì)SQL的處理需要按照如下的邏輯進(jìn)行編碼:
使用LinqExtender雖然可以幫助開發(fā)人員輕松的實(shí)現(xiàn)自己的自定義LINQ提供器,但是它還不那么成熟和完備,如目前的1.3版本缺乏對(duì)Group和Join等子句的支持;同時(shí)要求實(shí)體類繼承于QueryObjectBase基類也是一個(gè)不小的弱點(diǎn)。
- if (bucket.ItemsToTake != null)
- {
- // 1.Build Select statement using WITH
- }
- else
- {
- // 2.General select statement followed by order by , if any
- }
- // 3. Run query and fill IModify collection.
【編輯推薦】