0

ASP.Net で WebAPI を使用して、エンティティ フレームワーク オブジェクトへのアクセスを許可しています。私が抱えている問題は、エンド カスタマーが使用できるようにオブジェクトをカスタム POCO に変換することです。Entity Framework オブジェクトをカスタム POCO に変換する必要があります。

たとえば、SQL データベースには、次のプロパティを持つ Tbl_Person があります。

PersonID FirstName SureName DateOFBirth AnnualSalary

このテーブルは、同じプロパティを持つ Entity Framework クラスの Person にマップされます。しかし、エンド カスタマーがアクセスしたときに次のような POCO が得られるように、プロパティを変更したいと考えています。

PersonID 名前 年齢 SalaryRange

また、JSON や XMLoutput などの現在の機能を維持し、OData クエリを許可したいと考えています。Odata クエリを「収集」してデータベース コンテキストに適用しようとしましたが、正しく動作していないようです。以下のコード例を参照してください。

Imports System.Net
Imports System.Web.Http
Imports System.Data.Entity

Public Class PeopleData
    Inherits DbContext

    Public Property People() As DbSet(Of Person)

End Class

Public Class Person
    Public Property PersonID() As Integer
    Public Property FirstName() As String
    Public Property SureName() As String
    Public Property DateOFBirth() As Date
    Public Property AnnualSalary() As Integer
End Class

Public Class PeopleController
    Inherits System.Web.Http.ApiController

    Private db As New PeopleData

    Function GetPeople(query As OData.Query.ODataQueryOptions(Of Person)) As IQueryable(Of apiPerson)

        Dim pep = query.ApplyTo(db.People)
        Dim resPep As New List(Of apiPerson)
        For Each p In pep
            resPep.Add(New apiPerson(p))
        Next
        Return resPep.AsQueryable
    End Function

End Class

Public Class apiPerson

    Public Sub New(ByVal p As Person)
        PersonID = p.PersonID
        Name = p.FirstName & " " & p.SureName
        Age = Date.Now.Year - p.DateOFBirth.Year
        If p.AnnualSalary > 15000 Then
            SalaryRange = "High"
        Else
            SalaryRange = "Low"
        End If
    End Sub
    Public Property PersonID() As Integer
    Public Property Name() As String
    Public Property Age() As Integer
    Public Property SalaryRange() As String

End Class

2 つの問題があります。

1) API ヘルプ ページが表示されず、「サンプルが利用できません」というエラーのみが表示されます。ダイナミック ヘルプ ページが気に入っています。また、コード コメントが表示される点も気に入っています。これは、ドキュメントを維持するための非常に迅速かつ簡単な方法です。それらを ApiPerson と連携させるにはどうすればよいですか?

2) /api/people?$filter=Age eq 29 を試すと、Type 'MvcApiPeople.Person' にはプロパティ 'Age' がありませんというエラーが表示されます。LINQ クエリが「Person」に渡され、そのプロパティが存在しないことは理解していますが、クエリを「変換」して実際のデータベース オブジェクトのさまざまなプロパティにマップするにはどうすればよいですか?

4

3 に答える 3

1

あなたの行動宣言は

Function GetPeople(query As OData.Query.ODataQueryOptions(Of apiPerson)) As IQueryable(Of apiPerson)

つまり、クエリ パラメータはODataQueryOptions (Of apiPerson)not型である必要がありますODataQueryOptions (Of Person)

于 2013-06-24T17:16:13.270 に答える
0

多くのさまざまなソリューションを試した結果、API で利用できる情報を制御し、iQueryable を許可する最も簡単な方法は、データ コントラクト アノテーションを使用してデータベース レベルまたはクラス レベルでデータを制御することであると判断しました。

私は実際にデータベースにビューを作成して、最終顧客に表示したい方法でデータを正確にレンダリングしました。これは、パフォーマンスと実装の速度に最もメリットがあると感じました。

提案を提供してくれたすべての人に感謝します。

于 2013-10-22T09:08:52.963 に答える