我有以下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(),但这没有做任何事情(尽管调用成功)。
我觉得我错过了什么。有人知道如何实现这个目标吗?