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.
这有意义吗?
希望如此
亚历克斯
归档时间: |
|
查看次数: |
3024 次 |
最近记录: |