如何使用“SelectMany”使用 DataServiceQuery<>
我有以下 DataServiceQuery 运行 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 表达式的“SelectMany”版本(http://msdn. microsoft.com/en-us/library/bb549040.aspx),但我无法使其正常工作。
有人可以告诉我如何正确构建“SelectMany”调用吗?
感谢您的帮助。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
数据服务不支持将 SelectMany 与后续 Select 组合在一起,除非您包含一个键选择器来将“Many”过滤回仅一项。
如果您根据 URI 来考虑查询,您就会明白其中的原因。
在 OData URI 中,在导航之前您必须只有一个实体(即 /NavigationProperty)。
所以这样:
~/Users(123)/ConsumerXRef
是可以的,因为在检索许多相关的 ConsumerXRef 之前您有一个 User (123)。
但这并不好:
因为在导航到帐户之前您没有识别单个
ConsumerXRef
。当您将这种想法带入 LINQ 领域时,像这样:
是可以的,因为它大致翻译为:
~/Users(123)/ConsumerXRef
但这:
不好,因为 - 我在这里猜测 -
AccountName
不是密钥吗?因此,这会转换为类似于此 URL 的内容,该 URL 无效,因为您在没有先选择特定 ConsumerXRef 的情况下导航(从 ConsumerXRef 到其帐户)。
这有道理吗?
希望如此
亚历克斯
Data Services doesn't support composing SelectMany with a subsequent Select unless you include a key selector to filter the 'Many' back to just one item.
If you think about queries in terms of URIs you will understand why.
In OData URIs you have to have just one Entity before you navigate (i.e. /NavigationProperty).
So this:
~/Users(123)/ConsumerXRef
is okay because you have one User (123) before you retrieve the many related ConsumerXRef(s).
However this is no good:
because you don't identify a single
ConsumerXRef
before navigating to accounts.When you take this thinking into LINQ land, something like this:
is okay because it roughly translates to:
~/Users(123)/ConsumerXRef
But this:
is no good because - I'm guessing here -
AccountName
isn't the key? so this translates to something like this URLwhich is invalid because you've navigated (from ConsumerXRefs to their Accounts) without first selecting a specific ConsumerXRef.
Does this make sense?
Hope so
Alex