2011-09-25 53 views
1

我創建了一個公開自託管的OData Web服務的應用程序。 Web服務公開一組名爲「Main」的對象。這些Main對象中的每一個都引用了一個相關的「Details」對象,它非常大(很多屬性近百)。OData Linq問題

我現在使用LinqPad來測試我的web服務,這似乎工作正常。

通常我需要「Main」集合和相關的「Details」對象的信息。這可以通過運行下面的LINQ查詢來完成:

from m in Main.Expand("Details") 
where m.ID==57 
select m 

這correspons到的網址:

"http://MachineName:port/ServiceName/Main()?$filter=ID eq 57&$expand=Details" 

此查詢工作正常並返回完整主對象和全相關的詳細信息對象。

但是,Details對象非常大,並且通常我只需要來自兩個對象的單個屬性的值。

手動,我可以構建一個網址,讓我exacly說:

"http://MachineName/ServiceName/Main()?filter=ID eq 57&$expand=Details&$select=Property1,Details/Property2" 

返回包含Main.Property1才值和相關Details.Property2的價值XML。

問題:爲什麼我不能創建一個linq查詢來做到這一點?

當我嘗試類似:

from m in Main.Expand("Details") 
where m.ID == 57 
select new{ m.Property1, m.Details.Property2 } 

它給了我一個錯誤信息:「NotSupportedException異常:雖然是在同一個查詢中指定一個明確的擴張無法創建投影。」

我現在已經放棄使用Linq構建查詢。但是知道像上面那樣的URL,我如何直接在代碼中使用這個URL(C#客戶端),然後我如何訪問結果?

回答

4

不只是

from m in Main 
where m.ID == 57 
select new { m.Property1, m.Details.Property2 } 

爲你工作?

+0

這也適用於我。有趣的是,在OData請求URL中忽略集合的擴展,同時在該集合中選擇一個字段會給出:'「只有在$ expand中指定的屬性才能在$ select查詢選項中遍歷,選擇的項目是'BAlgemeen'。 「'。檢查IQueryable的RequestUri屬性顯示_ $ expand = BAlgemeen_是在從中選擇字段時自動添加的。 –