如何在DataServiceQuery <>中使用"SelectMany"

Sak*_*o73 3 wcf-data-services odata

我有以下DataServiceQuery运行agaist和ADO数据服务(安装了更新以使其像.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>;
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到一个例外:无法在单个资源上指定查询选项(orderby,where,take,skip)

据我所知,我需要使用一个包含附加lambda表达式的"SelectMany"版本(http://msdn.microsoft.com/en-us/library/bb549040.aspx),但我无法使其正常工作.

有人能告诉我如何正确构建"SelectMany"电话吗?

感谢您的任何帮助.

Ale*_*mes 12

除非您包含一个键选择器以将"多个"过滤回一个项目,否则数据服务不支持使用后续选择组合SelectMany.

如果您根据URI考虑查询,您将理解为什么.

在OData URI中,您必须在导航之前只有一个实体(即/ NavigationProperty).

所以这:

~/Users(123)/ConsumerXRef

没问题是因为在检索许多相关的ConsumerXRef之前你有一个用户(123).

然而这并不好:

~/Users(123)/ConsumerXRef/Account
Run Code Online (Sandbox Code Playgroud)

因为ConsumerXRef在导航到帐户之前您没有识别单个.

当你把这个想法带入LINQ土地时,就像这样:

from u in ctx.Users
where u.ID == 123
from c in u.ConsumerXRef
select c;
Run Code Online (Sandbox Code Playgroud)

没关系,因为它粗略地翻译成:

~/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;
Run Code Online (Sandbox Code Playgroud)

不好,因为 - 我猜这里 - AccountName不是关键?所以这转化为类似这个URL的东西

~/Users(123)/ConsumerXRef/Account/?$filter=AccountName eq 'MyAccount' ...
Run Code Online (Sandbox Code Playgroud)

这是无效的,因为您已经导航(从ConsumerXRefs到他们的帐户)而没有先选择特定的ConsumerXRef.

这有意义吗?

希望如此

亚历克斯