1

我有一个 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,从我的数据库生成。

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

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

4

1 回答 1

0

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

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

  1. 存储型号:

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

    <EntitySet Name="DistributionFiles" EntityType="Model.DistributionFiles" />

  3. 函数定义:

    <FunctionImport Name="GetDistributionFiles" EntitySet="DistributionFiles" ReturnType="Collection(Model.DistributionFiles)">

  4. 映射:

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

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

于 2013-09-20T11:44:28.937 回答