使用 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 中实现我自己的实体并使用存储过程使用它而不映射到数据库实体?或者可能是其他解决方案?
任何人都可以分享最佳实践吗?
我们在项目中也有类似的需求,我们最终在我们的模型中定义了一个假实体,该实体在物理数据库中没有相应的表。我们使用此实体类型从存储过程返回数据。
大致是我们所做的。我们的存储过程返回了一个类型为 DistributionFiles 的集合,该集合可以定义为复杂类型。相反,我们将其定义为实体类型。它导致了以下模型更改:
-
存储模式:
<EntityType Name="DISTRIBUTION_FILES"> <Key> ... keys </Key> ... properties </EntityType>
-
概念模型:
<实体集名称 实体类型="模型.分发文件" />
-
函数定义:
<函数导入名称 EntitySet="DistributionFiles" ReturnType="Collection(Model.DistributionFiles)">函数导入名称>
-
映射:
<EntityTypeMapping TypeName="Model.DistributionFiles"> <MappingFragment StoreEntitySet="DISTRIBUTION_FILES"> ... field mapping </MappingFragment> </EntityTypeMapping>
然后我可以使用分发文件实体,因为有一个相应的表。真正使用它的唯一地方是返回此实体集合的存储过程 GetDistributionFiles。