0

Web-API GETレポートの JSON を返すためにを使用しています。

GETメソッドは単純なdb.Reports.ToList();

これは私が取得したデータのダンプです

{
        "Project": {
            "Location": {
                "LocationId": 7,
                "Description": "New York"
            },
            "Department": {
                "DepartmentId": 7,
                "Description": "Engineering"
            },
            "ProjectId": 7,
            "Description": "Project_3",
            "LocationId": 7,
            "DepartmentId": 7
        },
        "Person": {
            "Email": "email@gmail.com",
            "FirstName": "John",
            "LastName": "Doe",
            "IsActive": true
        },
        "StatusCode": {
            "StatusId": 8,
            "Description": "Accepted"
        },
        "ReportId": "d4cddb3f-ea6a-4b0a-9820-19bd8ee43b3a",
        "Description": "Report 3",
        "RoundTrip": 45.88,
        "IsBillable": true,
        "StartDate": "2013-06-27T00:00:00",
        "EndDate": "2013-06-27T14:36:32.467",
        "TimeUpdated": "AAAAAAAAJxM="
    }, ... 
}

これは、関連する Report 宣言です。

public class Report
{
    public Guid ReportId { get; set; }
    public string Description { get; set; }
    public double RoundTrip { get; set; }
    public bool IsBillable { get; set; }

    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }

    public virtual Project Project { get; set; }

    public byte[] TimeUpdated { get; set; }

    public virtual Person Person { get; set; }

    public virtual StatusCode StatusCode { get; set; }
}

Reportこの状況では、クラスに含まれるさまざまなオブジェクトの ID だけを取得したいと考えています。たとえば、私は本当に見たいだけです:

    "Project": 7,
    "Location": 7,
    "Department": 7,
    "Person": "email@gmail.com",
    "StatusCode": 8,
    "ReportId": "d4cddb3f-ea6a-4b0a-9820-19bd8ee43b3a",
    "Description": "Report 3",
    "RoundTrip": 45.88,
    "IsBillable": true,
    "StartDate": "2013-06-27T00:00:00",
    "EndDate": "2013-06-27T14:36:32.467",
    "TimeUpdated": "AAAAAAAAJxM="
  1. これを行うための比較的簡単な方法はありますか?それとも、既に表示されている結果をさらに解析する方が良いでしょうか?
  2. EF がデフォルトで外部キーだけでなく、JSON 内にこれらのオブジェクトを作成するのはなぜですか?
4

2 に答える 2

3

特に新しいクラスを作成しなくても実行できます。ApiControllerで、型指定された戻り値の型を使用している場合 ( を優先して) HttpResponseMessage、List 型を次のように変更しIEnumerable<object>て戻ります。

return db.Reports.Select(r => new {
    Project = r.ProjectId;
    Location = r.Location.LocationId;
    Department = r.Department.DepartmentId;
    Person = r.Person.Email;
    StatusCode = r.StatusCode.StatusId;
    Description: r.Description
    RoundTrip: r.RoundTrip
    IsBillable: r.IsBillable,
    StartDate: r.StartDate,
    EndDate: r.EndDate
    TimeUpdated: r.TimeUpdated
});

// Or if you're using HttpResponseMessage
return Request.CreateResponse(HttpStatusCode.Ok, 
    db.Reports.Select(r => new {
        Project = r.ProjectId;
        Location = r.Location.LocationId;
        Department = r.Department.DepartmentId;
        Person = r.Person.Email;
        StatusCode = r.StatusCode.StatusId;
        Description: r.Description
        RoundTrip: r.RoundTrip
        IsBillable: r.IsBillable,
        StartDate: r.StartDate,
        EndDate: r.EndDate
        TimeUpdated: r.TimeUpdated
    }));

デフォルトの Json シリアライザー (Newtonsoft の Json.Net) は、無名オブジェクトをシリアライズするのに十分スマートです。上記のコードで唯一不明なのはTimeUpdated、バイト配列であるため、メンバーの動作です。割り当てを調整する必要がある場合があります。

于 2013-06-28T00:25:21.390 に答える
1

表示したいJSONを表示するためのモデルを作成することをお勧めします。これが最も簡単なオプションです。

このようなものが動作するはずです:

public class ReportSimple
{
    public Guid ReportId { get; set; }
    public int Project { get; set; }
    public int Location { get; set; } 
    public int Department { get; set; }
    public string Person { get; set; }
    public int StatusCode { get; set; }
    public string Description { get; set; }
    public double RoundTrip { get; set; }
    public bool IsBillable { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public byte[] TimeUpdated { get; set; }

    public ReportSimple(Project project, Person person, StatusCode statusCode)
    {
        Project = project.ProjectId;
        Location = project.Location.LocationId;
        Department = project.Department.DepartmentId;
        Person = person.Email;
        StatusCode = statusCode.StatusId;
    }
}
于 2013-06-27T18:56:08.470 に答える