4

我正在嘗試構建具有大量實體和一些服務操作的ADO.NET數據服務。一方面,我創建了一個ASP.NET Web應用程序,其中包含一個ADO.NET實體數據模型和一個ADO.NET數據服務。另一方面,我創建了第二個ASP.NET Web應用程序,該應用程序具有數據服務的服務引用。從.NET客戶端使用ADO.NET數據服務的服務操作

實體通過很好的未來,我可以使用LINQ來獲取我想要的數據:

TestEntities entities = new TestEntities(
      new Uri("http://localhost/service/service.svc")); 

var query = from customer in entities.Customers 
        where customer.ID == 1234 
        select customer; 

query.ToList(); 

這工作。但是,通過服務操作檢索信息完全沒有我。 數據服務端代碼:

public static void InitializeService(IDataServiceConfiguration config) { 
    config.SetEntitySetAccessRule("*", EntitySetRights.All); 
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 
} 

[WebInvoke] 
public IQueryable<Customer> GetSomeCustomers() { 
    TestEntities entities = new TestEntities(); 
    return from customer in entities.Customers 
     where customer.ID > 0 && customer.ID < 20 
     select customer; 
} 

當我加入了服務引用我的客戶項目,Visual Studio中沒有任何服務運營回升。我知道我可以通過構造的URI和Da​​taServiceContext對象或TestEntities對象的BeginExecute方法(在本例中)訪問它們,或者類似的東西,但這不是我想要的。

我想要的是使用LINQ來通過服務操作返回的數據。 這可能嗎?應該是吧?

回答

5

簡單的東西,一旦你知道。

只是幾件事情需要知道:

目前DataServiceClientGenerator(使用EntityClassGenerator)犯規創建服務操作方法。

服務操作不支持在上下文中使用CreateQuery方法,目前它們的工作原理是因爲在客戶端沒有對此進行驗證(您會注意到如果使用CreateQuery,「()」將添加到結尾查詢方法類似這樣的「http://localhost/service.svc/method()?parameter=2」,你可以使用的createQuery,但不建議。

並非所有的服務操作返回值,但在這個例子中,我將只顯示該做的那些例子。

public partial class NorthwindEntities 
{ 
    public IQueryable<Order> OrdersByRegion(int regionId) 
    { 
    return this.Execute<Orders>(new Uri(string.Format("{0}OrdersByCountry?regionId={1}", this.BaseUri, regionId), UriKind.RelativeOrAbsolute)); 
    } 
} 

如果您需要更多信息,請隨時提出任何問題。

PS:在您的示例中,您不需要在服務操作(服務器端)上創建新的數據上下文,DataService在調用該服務時已經實例化了一個引用。

實際上,你可以覆蓋在這樣的服務端創建數據上下文:

protected override NorthwindEntities CreateDataSource() 
{ 
    return new NorthwindEntities(); 
} 
+0

好吧,但你如何調用從客戶端的「OrdersByRegion」操作?您是否必須手動構建REST URL(例如http://server/service.svc/OrdersByRegion?regionId = 1)?謝謝。 – 2009-11-17 15:11:02

+1

嗨Ciprian,是的,不幸的是你做的。 string.format通常是最好用的。看到我的第一個代碼示例演示如何調用它 – dmportella 2009-11-17 22:48:16

+0

對不起,我忘記將其標記爲接受的答案(我正在瀏覽我的問題),那時我有點沮喪,URL不會自動生成。謝謝。 – pancake 2011-07-30 07:01:30