2012-07-16 69 views
0

我是WCF的新手,我需要幫助理解一些東西。客戶端過濾如何爲WCF IQueryable方法工作?

我創建了一個WCF數據服務,該服務返回由服務從實體映射的DTO。在我的服務合同界面上,我有一些方法GetMyDto返回IQueryable<MyDto>

我在MVC應用程序中添加了對此服務的服務引用。接口和代理客戶端然後返回List<MyDto>(或者我可以選擇一些其他集合類型)而不是IQueryable<MyDto>

據我所知IQueryable不能公開給客戶端,但如果我在客戶端上篩選(即MyServiceClient.GetMyDto().Where(x => x.SomeValue == 1))它是否過濾客戶端或服務器上?

我的理解是它可以使用odata,但是我看到的所有示例都直接將實體模型暴露給客戶端,我不這樣做。我正在使用DTO。

我的侷限性是什麼?當我撥打服務電話時,請幫助我瞭解到底發生了什麼。

回答

1

添加到什麼拉吉斯拉夫說(這是完全準確):

如果您使用的DTO,你在任何的反思提供土地或自定義提供土地。自定義提供程序允許極度自定義,但這是一個相當大的學習曲線。 AlexJ在這個話題上有非常出色的blog post series。反射提供者在這一點上有一些不幸的侷限性,但是很難列舉它們,所以最好只嘗試一下,看看你遇到的痛點。如果您沒有達到這些限制,那麼使用起來非常簡單,並且可能在幫助您建立服務方面做得很好。

團隊中的幾位成員真的想提高我們的提供者故事。我不能保證這將是我們在不久的將來的工作重點,但如果我們能夠解決的事情很少,我們很樂意聽到。

1

WCF數據服務的要點是向客戶端公開IQueryable。當您使用數據服務客戶端時,您正在查詢IQueryable。你的查詢被翻譯成OData查詢字符串(URL的一部分)並傳遞給服務器執行。

如果您需要客戶端過濾,您首先必須使用類似如下的方式將所有數據加載到客戶端應用程序:MyServiceClient.GetMyDto().ToList(),然後可以在列表上執行linq-to-objects過濾。