我有以下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”电话吗?
感谢您的帮助。
答案 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。
这有意义吗?
希望如此
亚历