我一直在 ASP.Net 中使用 WebAPI 来允许访问我们的实体框架对象。我遇到的问题是将对象转换为自定义 POCO 供我们的最终客户使用。我需要将实体框架对象转换为自定义 POCO。
例如,在我们的 SQL 数据库中,我们有 Tbl_Person 具有以下属性
PersonID FirstName SureName DateOFBirth AnnualSalary
此表映射到具有相同属性的实体框架类 Person。但我想更改属性,以便当最终客户访问它时,他们会得到如下 POCO:
PersonID 姓名 年龄 SalaryRange
我还想保留 JSON 和 XML 输出等当前功能并允许 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
我有两个问题:
1) API 帮助页面不会填充,只会产生以下错误:“样品不可用。” 我喜欢动态帮助页面,并且它们会收集代码注释,这是维护文档的一种非常快速简便的方法。我怎样才能让他们与 ApiPerson 一起工作?
2) 如果我尝试 /api/people?$filter=Age eq 29 我收到错误类型'MvcApiPeople.Person'没有属性'Age'。我知道 LINQ 查询已传递给“人员”并且该属性不存在,但我如何“翻译”查询以映射到实际数据库对象中的不同属性?