Select OData V4:是否只能从父实体(即导航属性)中选择字段?

Select OData V4:是否只能从父实体(即导航属性)中选择字段?,select,odata,expand,odata-v4,Select,Odata,Expand,Odata V4,在OData V3中,我可以仅从父/祖先实体中选择字段,如下所示: $select=产品/类别/类别名称&$expand=产品/类别 该查询只返回CategoryName,它不包括Order_Details或Product中的任何字段。出于性能原因,此行为对我们的应用程序非常重要。在不需要字段时选择所有字段会对查询性能产生重大影响 在ODataV4中似乎没有一种方法可以实现同样的效果。等效查询返回订单详细信息和产品的所有字段 ?$expand=产品($expand=类别($select=类别名称

在OData V3中,我可以仅从父/祖先实体中选择字段,如下所示: $select=产品/类别/类别名称&$expand=产品/类别

该查询只返回CategoryName,它不包括Order_Details或Product中的任何字段。出于性能原因,此行为对我们的应用程序非常重要。在不需要字段时选择所有字段会对查询性能产生重大影响

在ODataV4中似乎没有一种方法可以实现同样的效果。等效查询返回订单详细信息和产品的所有字段 ?$expand=产品($expand=类别($select=类别名称))


我能得到的最接近的方法是从每个级别只选择一个字段,这会给代码带来很多复杂性,而且很难确保所有查询(将来的和现有的)都遵守此规则。

最简单的解决方案是在db服务器上创建具有所需架构的视图,并尝试使用筛选器和列名从此数据源获取数据

尤其是在面临性能问题时

最好的办法是将这个班级注册为你的国际奥委会的单身学生

public class InternalODataEdmModelBuilder
{
    private readonly ODataConventionModelBuilder _oDataConventionModelBuilder = new ODataConventionModelBuilder();
    private IEdmModel _edmModel;

    public InternalODataEdmModelBuilder()
    {
        ODataEntitySetsConfigInternal.Register(_oDataConventionModelBuilder);
    }

    // cache
    public IEdmModel GetEdmModel()
    {
        return _edmModel ?? (_edmModel = _oDataConventionModelBuilder.GetEdmModel());
    }
}

internal static class ODataEntitySetsConfigInternal
{
    public static void Register(ODataConventionModelBuilder oDataModelBuilder)
    {
        if (oDataModelBuilder == null)
        {
            throw new Exception("'ODataConventionModelBuilderWebApi' cannot be null");
        }

        oDataModelBuilder.EntitySet<YourView>("YourView").EntityType.HasKey(x => x.YourKey);
    }
}
然后将数据映射到POCO(向公众展示的API EDM模型)


希望这有帮助。

其语法如下:

关键是从订单导航到父产品资源的路径:

~/Order_Details(OrderID=10248,ProductID=11)/Product
然后将扩展应用于该资源。看

这些规则是递归的,因此可以通过另一个实体来处理单个实体,通过单个实体来处理集合,甚至通过集合来处理集合;示例包括但不限于:

  • 通过遵循从单个实体到另一个相关实体的导航(请参见规则:entityNavigationProperty)
    例14:
    http://host/service/Products(1) /供应商
我能得到的最接近的方法是从每个级别中选择一个字段, 在我们的代码中引入了很多复杂性,并且 很难确保所有查询(未来查询和现有查询)都遵守 这条规则

看起来像这样:


这里当然增加了一点复杂性,但这在我的情况下是可以接受的。

这是一种可能的解决方法,在这个人为的示例中有帮助,但对于我使用过滤器且没有实体ID的实际查询没有帮助。我需要的是ODataV3的功能。不过,答案很有帮助,谢谢。谢谢@SeanJ_2173在这种情况下,您可以从子表中选择,并使用与父表匹配的筛选器。我没有在解决方案中提供这一点,因为您的问题专门针对项目查询,而不是集合查询。:)您应该发布一个更接近实际查询的示例。
~/Order_Details(OrderID=10248,ProductID=11)/Product