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」に渡され、そのプロパティが存在しないことは理解していますが、クエリを「変換」して実際のデータベース オブジェクトのさまざまなプロパティにマップするにはどうすればよいですか?