【问题标题】:Odata $expand not working in Dynamic EdmModel CreationOdata $expand 在动态 EdmModel 创建中不起作用
【发布时间】:2019-08-23 11:25:39
【问题描述】:

我通过参考 https://github.com/OData/ODataSamples/tree/master/WebApiCore/DynamicEdmModelCreation 完成了动态 edm 模型的创建。

我已将 odata 查询选项添加到上述项目中。 $filter, $top, $count, $select(without expand) 工作成功。但是当我查询~/odata/Products?$expand=DetailInfo 时 - 它没有返回 DetailInfo 的任何值。任何人都可以帮我解决上述问题

 EdmEntityObject entity = new EdmEntityObject(entityType);
 entity.TrySetPropertyValue("Name", "abc");
 entity.TrySetPropertyValue("ID", 1);
 entity.TrySetPropertyValue("DetailInfo", CreateDetailInfo(88,"abc_detailinfo", entity.ActualEdmType)); 
 collection.Add(entity);
 entity = new EdmEntityObject(entityType);
 entity.TrySetPropertyValue("Name", "def");
 entity.TrySetPropertyValue("ID", 2);
 entity.TrySetPropertyValue("DetailInfo", CreateDetailInfo(99, "def_detailinfo", entity.ActualEdmType));
 collection.Add(entity);

执行上述代码后,集合包含 2 个值,每个值具有 3 个属性、2 个结构属性(名称、id)和 1 个保存 DetailInfo 值的导航属性。

当前输出:

[{"Name":"abc","ID":1},{"Name":"def","ID":2}]}

预期输出:

[{"Name":"abc","ID":1, "DetailInfo":{"ID":88,"Title":"abc_detailinfo"}},{"Name":"def","ID":2, "DetailInfo":{"ID":99,"Title":"def_detailinfo"}}]}

【问题讨论】:

    标签: .net odata


    【解决方案1】:

    使用动态 EDM 模型创建时,您必须自己实现应用 ODataQueryOptions 的逻辑。

    这意味着您的控制器中的 GET(id) 方法如下所示。

        public IEdmEntityObject Get(string key)
        {
            // Get entity type from path.
            ODataPath path = Request.ODataFeature().Path;
            IEdmEntityType entityType = (IEdmEntityType)path.EdmType;
    
            // Create an untyped entity object with the entity type.
            EdmEntityObject entity = new EdmEntityObject(entityType);
    
            string sourceString = Request.GetDataSource();
            DataSourceProvider.Get(sourceString, key, entity);
    
    
            IEdmModel model = Request.GetModel();
            ODataQueryContext queryContext = new ODataQueryContext(model, entityType, path);
            ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, Request);
    
            // Apply query options here.
    
            return entity;
        }
    

    这意味着您的控制器中的 GET 方法如下所示。

        public EdmEntityObjectCollection Get()
        {
            // Get entity set's EDM type: A collection type.
            ODataPath path = Request.ODataFeature().Path;
            IEdmCollectionType collectionType = (IEdmCollectionType)path.EdmType;
            IEdmEntityTypeReference entityType = collectionType.ElementType.AsEntity();
    
            // Create an untyped collection with the EDM collection type.
            EdmEntityObjectCollection collection =
                new EdmEntityObjectCollection(new EdmCollectionTypeReference(collectionType));
    
            string sourceString = Request.GetDataSource();
            // Add untyped objects to collection.
            DataSourceProvider.Get(sourceString, entityType, collection);
    
    
            IEdmModel model = Request.GetModel();
            ODataQueryContext queryContext = new ODataQueryContext(model, collectionType.AsElementType(), path);
            ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, Request);
    
            // Apply query options here.
    
            return collection;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多