2010-02-11 10 views
3

У меня есть следующие DataServiceQuery работы agaist службы данных 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) на одном ресурсе

Насколько я могу судить, мне нужно использовать версию «SelectMany», которая содержит добавочное лямбда-выражение (http://msdn.microsoft.com/en-us/library/bb549040.aspx), но я не могу заставить это работать правильно.

Может ли кто-нибудь показать мне, как правильно структурировать вызов «SelectMany»?

Благодарим за помощь.

+0

Может быть, я неправильно об этом быть "SelectMany" вызов. Любая помощь приветствуется. – Sako73

ответ

12

Служба передачи данных не поддерживает составление SelectMany с последующим выбором, если вы не включили селектор ключей для фильтрации «Много» обратно только на один элемент.

Если вы думаете о запросах с точки зрения URI, вы поймете, почему.

В URI OData вы должны иметь только одну Сущность перед тем, как вы перемещаетесь (то есть/NavigationProperty).

Так что:

~/Users(123)/ConsumerXRef

это хорошо, потому что у вас есть один пользователь (123), прежде чем извлечь много связанных ConsumerXRef (ы).

Однако это не хорошо:

~/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.

Имеет ли это смысл?

Надежда так

Alex

+0

Вы имели в виду 'c' вместо' x' в 'select x.Account;'? – julealgon