使用 OData 实现排序/筛选/分页操作,其中包含由存储过程返回的复杂类型的集合

本文关键字:存储过程 包含 返回 集合 复杂 类型 排序 实现 OData 筛选 分页 | 更新日期: 2023-09-27 18:31:55

我有一个n层应用程序。客户端和应用程序服务器与 OData 协议交互。我只能使用实体框架提供的数据库实体实现排序/过滤/分页。C#

DataServiceQuery<MyEntity> CAQuery = WebService.MyEntity;
CA = new QueryableDataServiceCollectionView<WagonReestr>(WebService, CAQuery);
CA.PageSize = 10;
CA.MoveToFirstPage();
CA.Load(true);

XAML

<t:RadGridView Grid.Row="2" ItemsSource="{Binding Path=CA}" 
                     IsBusy="{Binding Path=CA.IsBusy}" 
                     ShowGroupPanel="False" AutoGenerateColumns="True"/>
<t:RadDataPager Grid.Row="3" Source="{Binding Path=CA}"/>

DataServiceQuery 提供 OData 查询,例如 hxxp://...service.svc/MyEntity?$skip=20&$top=10我的服务提供了一个基于 ObjectContext 的 OData API,该 API 是从我的数据库生成的。

我需要为存储过程结果提供相同的功能,这将返回复杂类型的列表。也许有某种方法可以在 ObjectContext 中实现我自己的实体并使用存储过程使用它而不映射到数据库实体?或者可能是其他解决方案?

任何人都可以分享最佳实践吗?

使用 OData 实现排序/筛选/分页操作,其中包含由存储过程返回的复杂类型的集合

我们在项目中也有类似的需求,我们最终在我们的模型中定义了一个假实体,该实体在物理数据库中没有相应的表。我们使用此实体类型从存储过程返回数据。

大致是我们所做的。我们的存储过程返回了一个类型为 DistributionFiles 的集合,该集合可以定义为复杂类型。相反,我们将其定义为实体类型。它导致了以下模型更改:

  1. 存储模式:

    <EntityType Name="DISTRIBUTION_FILES">
      <Key>
            ... keys
      </Key>
        ... properties
    </EntityType>
    
  2. 概念模型:

    <实体集名称 实体类型="模型.分发文件" />

  3. 函数定义:

    <函数导入名称 EntitySet="DistributionFiles" ReturnType="Collection(Model.DistributionFiles)">

  4. 映射:

    <EntityTypeMapping TypeName="Model.DistributionFiles">
      <MappingFragment StoreEntitySet="DISTRIBUTION_FILES">
        ... field mapping
      </MappingFragment>
    </EntityTypeMapping>
    

然后我可以使用分发文件实体,因为有一个相应的表。真正使用它的唯一地方是返回此实体集合的存储过程 GetDistributionFiles。