3

我有以下针对 ADO 数据服务运行的 DataServiceQuery(安装了更新以使其像 .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 表达式的“SelectMany”版本(http://msdn.microsoft.com/en-us/library/bb549040.aspx),但我无法让它正常工作。

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

感谢您的任何帮助。

4

1 回答 1

12

Data Services 不支持将 SelectMany 与后续 Select 组合在一起,除非您包含一个键选择器以将“Many”过滤回仅一项。

如果您根据 URI 来考虑查询,您就会明白为什么。

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

所以这:

~/Users(123)/ConsumerXRef

没关系,因为在检索许多相关的 ConsumerXRef(s) 之前,您有一个用户 (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' ...

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

这有意义吗?

希望如此

亚历克斯

于 2010-03-26T03:31:29.020 回答