Odata查询不会扩展

时间:2014-12-08 22:03:00

标签: asp.net-web-api odata

我使用以下网址查询我的服务:

http://a.com:3080/odata/DiscussionVM(6)?$扩大=科,用户

控制器方法

[EnableQuery(MaxExpansionDepth = 7)]
        public SingleResult<DiscussionVM> GetDiscussionVM([FromODataUri] int key)
        {
            return SingleResult.Create(db.DiscussionVMs.Where(discussionVM => discussionVM.DiscussionId == key));
        }

这可以工作并返回正确的JSON。

然而,我在另一个模型上运行稍微更高级的查询:

http://a.com:3080/odata/OrganisationVM(30)?& $扩大=分类($扩大=讨论($扩大=科,用户))

和控制器操作:

// GET: odata/OrganisationVM(5)
        [EnableQuery(MaxExpansionDepth = 5, AllowedQueryOptions = AllowedQueryOptions.All)]
        public SingleResult<OrganisationVM> Get([FromODataUri] int key)
        {
            return SingleResult.Create(db.OrganisationVMs.Where(organisationVM => organisationVM.OrganisationId == key));
        }

这将返回以下DiscussionVM JSON:

{
@odata.type: "#Models.DiscussionVM",
DiscussionId: 6,
Section_SectionID: 1005,
User_Id: "4cecc52e-ac3a-4696-ac6c-175af2a6378a",
DateCreated: "2014-12-06T00:00:00Z",
OrgCat_OrganisationCategoryId: 1,
Text: "Dummy section",
Html: null,
IsUserCreated: true,
Organisation_OrganisationId: null,
Positives: null,
Negatives: null,
CommentCount: 1
}

但不包含UserSection对象。不会抛出任何错误。在数据库中查询(分析)正确的对象,并返回包括用户和部分在内的数据。

3 个答案:

答案 0 :(得分:0)

我之前从未见过您的$expand语法。你是从哪里得到的?我认为您必须通过以下方式扩展您的查询:

http://a.com:3080/odata/OrganisationVM(30)?$expand=Categories/Discussions/Section,Categories/Discussions/User

假设Odata V4,here是该标准的一些例子。

答案 1 :(得分:0)

Brad和我在this SO answer收集的内容可能是将复杂类型与实体类型混合的问题。如果你的所有类型都是实体,那么展开会非常好,但是如果你混合使用这两种类型,你最终会遇到像我这样的怪异行为。

如果你混合它们,扩展级联必须从实体类型开始,以复杂类型结束。扩展链似乎在复杂类型具有实体类型属性的地方结束。

这可能来自v3,其中引用实体类型的复杂类型不支持。它在V4中,但我们可以看到它与WebAPI并不完全一样。

缺乏关于此事的文件和支持使得很难说这是绝对的事实,但至少它解释了我的情况并使我的工作成功。希望它也能帮到你。

答案 2 :(得分:0)

我发现oData需要在其Edm模型中引用扩展实体。 如果没有,它将在第一级后停止扩展,这就是为什么进一步扩展将无法工作的原因。

只需将您的可扩展EntitySet添加到IEdmModel中的ODataConventionModelBuilder(在MapODataServiceRoute的模型配置中):

var builder = new ODataConventionModelBuilder();
// ...
builder.EntitySet<Categories>("categories");
// ...

希望这有帮助。