0

我一直在 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 查询已传递给“人员”并且该属性不存在,但我如何“翻译”查询以映射到实际数据库对象中的不同属性?

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 的最简单方法是使用 Data Contract 注释在数据库级别或类级别控制数据。

实际上,我在我的数据库中创建了视图,以准确地呈现我希望它为最终客户呈现的数据。我觉得这对性能和实施速度有最大的好处。

感谢所有提供建议的人。

于 2013-10-22T09:08:52.963 回答
0

关于你的问题1:

我认为您的问题是 apiPerson-class 缺少无参数构造函数。

另外,我发现了一篇博客文章,其中包含一些关于在默认生成机制不起作用时如何自定义示例生成的信息:

http://blogs.msdn.com/b/yaohuang1/archive/2012/10/13/asp-net-web-api-help-page-part-2-providing-custom-samples-on-the-help-页面.aspx

于 2013-09-26T20:10:09.073 回答