在 WCF 数据服务 (OData) 的投影(选择)中展开

2024-01-04

假设我有一个如下所示的 OData 查询(我的实际查询要复杂得多):

Orders.Select(z => new { z.SubOrder.Addresses,
                         z.SubOrder.Cost,
                         z.SubOrder.SubOrderId, 
                         z.Sequence});

这很好用。除了 Address 对象有一个子对象 (StateRef) 之外。由于 StateRef 在 State 表上进行查找,因此它返回为 null。

为了说明这一点,下面是地址对象 Address 的示例:

Address:
    string         Street 1
    string         Street 2
    StateRef       PrimaryState
    string         City
    // ... 42 other string attributes not shown ...

The StateRef对象上面有州的名称,但也有一些其他重要的州属性(也许是州鸟?)

所以,我想知道的是,我现在是否必须为 z.SubOrder.Addresses 创建一个包含所有 46 个属性的“子投影”,以便我可以访问PrimaryState item? (我希望不是)

除了需要更多的编码之外,这还意味着我必须使用匿名类型。这使得我的映射必须手动进行(而不是使用 AutoMapper)。

那么我正在寻找一种在投影内“扩展”StateRef 的方法?

像这样的事情:

Orders.Select(z => new { z.SubOrder.Addresses.Expand("PrimaryState"),
                         z.SubOrder.Cost,        ^
                         z.SubOrder.SubOrderId,  |
                         z.Sequence});           |
                                                 |
// This is not allowed by the compiler ----------+

尝试这样做会出现此错误:

无效的匿名类型成员声明符。匿名类型成员必须使用成员赋值、简单名称或成员访问来声明。

Update:这是一个示例查询来说明我要问的内容:

Users.Take(10).Select(x=>new { x.Id, x.Reputation, x.Comments})

运行它反对“data.stackexchange.com/stackoverflow/atom https://data.stackexchange.com/stackoverflow/atom”。您将看到 Comments 有一个返回 null 的 Post 对象。

我需要它来返回其中的值。

注意:我知道我可以手动将它们全部输入到“子”投影中。请阅读上面的内容,了解为什么我不希望这样。


这当然是可能的。为了进行概念验证,请尝试执行以下命令:

var uri = new Uri( "http://data.stackexchange.com/stackoverflow/atom/Users()?$top=10&$expand=Comments/Post&$select=Id,Reputation,Comments/" );
entities.Execute<User>( uri, "GET", false ).Select( x => new { x.Id, x.Reputation, x.Comments } );

Expand的正确用法是这样的:

entities.Users.Expand( "Comments/Post" ).Take( 10 ).ToArray();

我不知道为什么该库的作者决定禁止使用带有投影的扩展,但正如上面的概念证明所示,这样做当然是可能的。

如果您不介意接收整个用户并在此之后进行投影,则可以使用第二个示例。否则,您可以编写自己的帮助程序,它将生成第一个示例中的 URI,执行它们,然后添加投影。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WCF 数据服务 (OData) 的投影(选择)中展开 的相关文章

随机推荐