2011-01-11 44 views
3

我需要創建一個WCF服務以通過實體框架返回從數據庫查詢的對象。我讀過的大多數文章都建議我應該爲每種類型的查詢創建一個方法。但我認爲這將導致方法數量的爆炸,我將創建,例如:實體框架4通過WCF的LINQ to Entities查詢

  • GetAllCars()
  • GetCarsByBrand(字符串名優產品)
  • GetCarsByYear(INT年)
  • GetCarsByBrandAndYear(串名優產品,INT年)
  • GetCarsByTireSize(浮動tireSize)
  • GetCarsByEngineType(字符串engineType)
  • GetCarsByEngineSizeAnd類型(浮動engineSize,串engineType)
  • GetCarsByEngineSizeBetween(浮動lowerEngineSize,浮動upperEngineSize)
  • 等。

最重要的是,如果需要一個新的查詢,那麼我將不得不創建一個新方法supoport它。

必須有一個更好的更通用的方法來做到這一點。如果客戶端可以通過LINQ創建表達式樹,通過WCF發送它,然後通過實體框架運行查詢,那麼理想的是什麼。然後我可以有一種方法來支持所有查詢。例如:

  • QueryCars(表達式表達式)

或發送表達式作爲字符串:

  • QueryCars(字符串表達式)

如何有開發商解決了這個靈活查詢問題?

我目前在.NET 4.0中工作。由於這僅僅是一個內部應用程序,所以安全性並不是一個問題。

回答

3

您要找的是WCF Data Services。它使用OData協議通過Linq查詢數據。

實施例與Stack Overflow OData service

var query = from u in service.Users 
      orderby u.Reputation descending 
      select u; 

Console.WriteLine ("Top ten Stack Overflow users"); 
foreach (var u in query.Take(10)) 
{ 
    Console.WriteLine ("{0}: {1}", u.DisplayName, u.Reputation); 
} 

在上面的代碼,service.Users是IQueryable<User>類型,它允許您與表達式樹查詢它的。

您可以使用LINQPad輕鬆地嘗試SO服務,或者在VS項目中添加對服務URL的引用。

+0

這看起來像我正在尋找的答案。出於好奇,在WCF數據服務之前如何解決這個問題? – Mas 2011-01-11 11:44:44