2012-03-19 32 views
1

我在.NET中用返回的Queryable上的.FirstOrDefault()嘗試了WCF數據服務。但是當與Fiddler一起檢查時,它仍然會返回整組對象。我必須做錯什麼?WCF數據服務IQueryable First()返回整個列表(用Fiddler驗證)。爲什麼?

的代碼是很基本的:

[OperationContract] 
IQueryable<Note> Query(); 

[WebGet(UriTemplate = "")] 
public IQueryable<Note> Query() 
{ 
    return _source.OfType<Note>().AsQueryable<Note>(); 
} 

Note note = _client.Query().FirstOrDefault(); 

這仍然會產生和在網絡上傳輸的所有音符。

我錯過了什麼?

可我甚至用的IQueryable和「遠程LINQ」與正常的WCF Web服務?

我發現了他們所使用的DataService(T),並作爲客戶端在本地一個DataServiceContext一些例子。我確實嘗試過,但我從來沒有得到它的工作。

我唯一需要的就是這種「遠程LINQ」功能包括這樣我就可以通過LINQ查詢我的web服務和只,例如,要求第一時,不能與所有的項目作出迴應。

+0

你舉的例子不是類型的WCF RIA服務,WCF RIA服務有不同的語法。 – 2012-03-19 20:53:41

回答

2

當你調用FirstOrDefault()你是在客戶端,你將收穫整個列表和你的客戶將其過濾得到的只有第一個。如果你只想下載第一個元素,你需要一個特殊的webMethod,你是在服務器端執行firstOrDefault。

[WebGet] 
public Note QueryFirst() 
{ 
    return _source.OfType<Note>().AsQueryable().FirstOrDefault(); 
} 
+0

什麼? IQueryable的整個想法是不是可以用來做LINQ客戶端並讓它執行服務器端? – 2012-03-19 18:34:36

+0

所以你要使用WCF數據服務:http://stackoverflow.com/questions/4291370/expose-iqueryable-over-wcf-service – 2012-03-19 18:40:20

0

我遇到了使用First()使用NETFx HttpEntityClient的其他問題。它在使用First()時引發NotSupportedException。

OData不支持首先,但支持Take或Skip。

這是我最後不得不做的事:

Note note = _client.Query().Take(1).ToArray().FirstOrDefault(); 
+0

很難想象,這將工作任何不同於'首先()' – 2012-12-04 04:07:29

+0

我使用NETFx HttpEntityClient,如果嘗試使用First(),將引發NotSupportedException。 First()不受OData查詢支持。由於Take()和Skip()受OData支持,所以可以使用它們。我可以確認此代碼確實按預期工作。 – joelnet 2012-12-06 01:25:43

相關問題