如何在DataServiceQuery<>中使用“SelectMany”

时间:2010-02-11 19:18:21

标签: 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>;

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

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

有人可以告诉我如何正确构建“SelectMany”电话吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:12)

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

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

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

所以这个:

~/Users(123)/ConsumerXRef

没关系,因为在检索许多相关的ConsumerXRef之前你有一个用户(123)。

然而这并不好:

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

这有意义吗?

希望如此

亚历