1

n 層アプリケーションがあります。クライアントとアプリケーション サーバーは、OData プロトコルと対話します。Entity Framework によって提供されるデータベース エンティティでのみ、並べ替え/フィルター/ページネーションを実装できます。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 は、hxxp://...service.svc/MyEntity?$skip=20&$top=10 などの OData クエリを提供します。私のサービスは、データベースから生成された 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 に答える