WCF Data Services 不使用 Entity Framework 的方式

相信許多人對 WCF Data Services 都不陌生,他其實就是微軟最先支援 OData 的 Solution。會寫這一篇的來由是這樣的,前些天有人問筆者,開發 WCF Data Services 一定都得用 Entity Framework 嗎?

相信許多人對 WCF Data Services 都不陌生,他其實就是微軟最先支援 OData 的 Solution。會寫這一篇的來由是這樣的,前些天有人問筆者,開發 WCF Data Services 一定都得用 Entity Framework 嗎?因為大部分在 Google 所能找的到的範例都是使用 Entity Framework 居多,其實不然,因為對 WCF Data Services 來說,DataServices 類別帶入泛型的 DataContext 類別中,只要有一個以上的 IQueryable 的 Entity,就可以透過 DataServices 開放出來成為 OData 服務。需要注意的是,開放出來的實際 Entity 類別要加上 [DataServiceKey("Key欄位")] 的屬性

我們蘭看看底下的範例,其中 DataServices 類別帶入的泛型類別用了一個自定義的 BLEventLog 類別,如下:

image

 

我們來做一個有趣的事情好了,還記得筆者上一次的 LINQ 開發課程中有講到的 LINQ2EventLog 範例嗎?我們可以很輕易的將系統的事件檢視器以 IEnumerable<T> 方式取出來,因此我們當然也可以很輕易地將這個 EventLog 的IEnumerable<T> 轉換為 IQueryable<T> 並放置在 BLEventLog 這個 DataService 這個 DataContext 中。

如下程式,紅色區塊的部分就是筆者在 LINQ 開發的課程中所講的那一段 LINQ2EventLog 的程式碼,

image

讀者可以發現,下方我在 return 的時候再將其轉為 IQueryable<VEventLog>,所以在這之前,筆者已先定義好 VEventLog 這個 Entity,並記得加上 DataServiceKey 的屬性,如下:

   1:      [DataServiceKey("InstanceId")]
   2:      public class VEventLog
   3:      {
   4:          public string Source { get; set; }
   5:          public long InstanceId { get; set; }
   6:          public string Message { get; set; }
   7:          public DateTime? TimeGenerated { get; set; }
   8:          public string UserName { get; set; }
   9:      }

上方的程式,我們已經可以順利的執行,並在瀏覽器中得知此 WCF Data Services 有一個 Entity 名稱為 VEventLog,如下:

image

重點是,我們可以透過它使用各種 OData 的 top 或 filter 等 QueryOption 與這個 WCF Data Services 互動,如下:

image

如下,查詢 Source 欄位等於 "Windows Search Service" 的資料,使用 Google Chroem 比較輕易看出回傳的資料是否正確。

image

如果將此服務掛在 IIS 上,那麼我在家裡也可以輕易使用 LINQPad 來存取 Server 的 EventLog 了。不過此舉請小心使用,應該自行加入驗證機制,以避免被不當人士得知 Server 的相關資訊。

 

結語:

從這裡其實不難看出微軟許多年前,從 .NET 3.0 平台開始就開始發展 IQueryable<T> 等介面功能,不光是發展自家的 LINQ 查詢,也是為了支援之後的開發是資料存取標準 OData 與近期的 Web API 的資料存取協定,因此真的可以說,如果玩 .NET 平台,您真的不可以不懂這些東西。


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^