在OData

时间:2017-06-29 19:30:13

标签: c# asp.net entity-framework odata

我有以下EF实体。

public class Order
{
    public List<OrderItem> OrderItems { get; set; }

    public bool Delivered { get { /* some logic involving OrderItems */ } }
}

我用OData注册它:

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Order>("Orders");

我的问题是这个“Delivered”不是数据库中的一个字段,而是根据各个OrderItems的状态动态计算的。因此,这是一个昂贵的计算领域,所以我只想在客户明确要求“$ expand = Delivered”时才包含它。如果未指定此扩展,则不包括该属性,因此不会计算它并且操作很便宜。

不幸的是,这没有在ODataController中通过验证,它失败了:

Microsoft.OData.ODataException: 'Property 'Delivered' on type 'Gemalto.Sas.Authentication.Entities.UserDto' is not a navigation property or complex property. Only navigation properties can be expanded.'

哪种有道理。由于我无法将其变为导航属性,因此我尝试将其变为复杂类型。如果我理解这一点,复杂类型是“没有主键的非标量对象”。所以我认为将其转换成这将有助于:

public class Order
{
    ...

    public ComplexValue Delivered { get; set; }
}

public class ComplexValue
{
    public boolean Value { get { /* complex logic here ... */ } }
}

但ODataConventionModelBuilder仍然不会将其创建为复杂类型,而是作为普通属性创建(通过CSDL导出确认)。我还尝试在构建器上显式调用.ComplexType(),但这没有做任何事情(尽管调用成功)。

我觉得我错过了什么。有人知道如何实现这个目标吗?

0 个答案:

没有答案