2010-02-11 48 views
3

我有以下的運行化DataServiceQuery安劍錚,卓傑一個ADO數據服務(安裝了更新,使其運行像.NET 4):如何使用「的SelectMany」以化DataServiceQuery <>

DataServiceQuery<Account> q = (_gsc.Users 
      .Where(c => c.UserId == myId) 
      .SelectMany(c => c.ConsumerXref) 
      .Select(x => x.Account) 
      .Where(a => a.AccountName == "My Account" && a.IsActive) 
      .Select(a => a)) as DataServiceQuery<Account>; 

當我運行,我得到一個例外:無法在單個資源上指定查詢選項(orderby,where,take,skip)

據我所知,我需要使用一個包含額外lambda表達式的「SelectMany」版本http://msdn.microsoft.com/en-us/library/bb549040.aspx),但我無法使其正常工作。

有人能告訴我如何正確構建「SelectMany」調用?

謝謝你的幫助。

+0

我可能會誤以爲這是在 「的SelectMany」 電話。任何幫助表示讚賞。 – Sako73 2010-02-11 19:29:35

回答

12

數據服務不支持使用隨後的Select選擇SelectMany,除非您包含一個密鑰選擇器以將「Many」過濾回一個項目。

如果考慮URI的查詢,你會明白爲什麼。

在OData URI中,在導航之前(即/ NavigationProperty),您必須只有一個實體。

所以這個:

~/Users(123)/ConsumerXRef

是好的,因爲你有一個用戶(123)您檢索許多相關ConsumerXRef(S)前。

然而,這沒有什麼好:

~/Users(123)/ConsumerXRef/Account 

,因爲你不導航到帳戶之前確定一個單一的ConsumerXRef

當你把這個想法變成LINQ的土地,這樣的事情:

from u in ctx.Users 
where u.ID == 123 
from c in u.ConsumerXRef 
select c; 

是好的,因爲它大致翻譯爲:

~/Users(123)/ConsumerXRef

但這:

from u in _gsc.Users 
where u.UserId == myId 
from c in u.ConsumerXref 
where c.AccountName == "MyAccount" && c.IsActive 
select x.Account; 

不好,因爲 - 我在這裏猜測 - AccountName不是關鍵?所以這樣的語句是這樣的URL

~/Users(123)/ConsumerXRef/Account/?$filter=AccountName eq 'MyAccount' ... 

因爲您瀏覽(從ConsumerXRefs到他們的帳戶)沒有首先選擇特定ConsumerXRef這是無效的。

這是否有意義?

希望如此

亞歷

+0

您是否在'select x.Account;'中使用'c'而不是'x'? – julealgon 2013-11-13 14:38:08

相關問題