Как использовать «SelectMany» с DataServiceQuery <> - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть следующий DataServiceQuery, запускающий agaist ADO Data Service (с установленным обновлением, чтобы он работал как .net 4):

 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"?

Спасибо за любую помощь.

1 Ответ

12 голосов
/ 26 марта 2010

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

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

В URI OData у вас должен быть только один объект, прежде чем вы перейдете (т.е. /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.

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

Надеюсь, так

Alex

...