12

我一直在學習關於IQueryable和延遲加載/延遲執行查詢。通過WCF服務公開IQueryable

是否可以通過WCF公開此功能?我想公開一個返回IQueryable的LINQ-to-SQL服務,然後我可以在客戶端執行額外的查詢,最後使用.ToList()執行。在這種情況下OData格式是否適用?

如果可能的話,這個技術的術語是什麼,以及我可以遵循的一些很好的教程是什麼?謝謝。

+0

對於Silverlight,您可以使用WCF RIA服務 – RichardOD 2012-02-26 18:18:06

回答

11

您應該檢查WCF Data Services,讓您在客戶端上定義Linq查詢。 WCF數據服務可能是您需求的唯一解決方案。

IQueryable仍然只是接口,功能取決於實現接口的類型。您不能直接公開Linq-To-Sql或Linq-To-Entities查詢。有很多原因,如短生存上下文或序列化將執行查詢,以便客戶端將獲得所有對象的列表而不是查詢。

+0

謝謝,這就是我一直在尋找的東西。 – Trust 2010-11-27 11:51:54

1

,據我所知,在DataContext是不可序列化的意思,你無法通過它與周圍WCF

1

您可以使用http://interlinq.codeplex.com/,它允許您通過WCF發送Linq查詢。

WCF數據服務只能與webHttpBinding一起使用,並不是所有的Linq查詢都可以表示。當使用WCF數據服務編寫查詢也不是那麼吸引人 - 需要字符串表達式,如:

.AddQueryOption("$filter", "Id eq 100"); 
0

我一直在掙扎了同樣的問題,並認識到,一個良好形成的問題是亟待解決的問題。

IQueryable基本上用於在將查詢發送到您的數據庫調用之前對其進行過濾,因此,您不必獲取1000條記錄並只過濾10條記錄,而是可以從10條記錄開始。該過濾屬於您的服務層,但如果您正在構建一個API,我會假設您將它與URL中的AND/OR參數進行映射。

http:// {host}/{entity}/q?name = john & age = 21。

所以,你最終的東西是這樣的:

Filter:Column1=Value1 > http://{host}/{entity}q?column1=value1 > SELECT * 
                    FROM Entity 
                    WHERE Column1=Value1 

MVC     > WCF         > DB 

你可以找到一個很好的樣本[here]

最後,由於從WCF的有效載荷將是最有可能是JSON,你可以(也應該)然後在集合中的域模型中反序列化它們。直到這一點,分頁應該發生,所以我會推薦一些WCF緩存(並且因爲它的HTTP,它非常簡單)。你仍然會在WebApp方面使用LINQ,只是沒有「WHERE」LINQ子句(除非你想動態創建上面表達的URL)

對於一個複雜的OR查詢,你會介意使用多個WCF查詢(每個「AND」1),然後將它們連接在一起

-1

如果可以通過WCF發送IQuerable <>這不是安全明智的好事,因爲IQuerable <>可能會將連接字符串等內容暴露給數據庫。 雖然以前的一些評論看起來很有希望。

+0

「這不是一個好的安全明智的事情......」這不是依賴於`IQueryable`實現的具體方式嗎? – Crono 2015-06-12 18:33:11

1

https://remotelinq.codeplex.com/是另一種選擇。但它在AppDomain中工作以掃描Current Assemblies並序列化它們。此技術不適用於WinRT,因爲沒有WinRT域的應用程序