2014-10-27 201 views
0

我需要幫助才能從Web Api獲取數據。我用EF與名爲 「Reichweites」 和 「點」(孩子)兩個表將C#對象的WebApi響應轉換爲JSON

這是我的DTO類:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Web; 

namespace xms_ef_vers1.Models 
{ 
    public class ReichweitePointsDto 
    { 

     public ReichweitePointsDto() { } 

     public ReichweitePointsDto(Reichweite reichweite) 
     { 
      ReichweiteID = reichweite.Id; 
      Name = reichweite.Name; 
      Potenzial = reichweite.Potenzial; 
      Geschlecht = reichweite.Geschlecht; 
      CPGRP = reichweite.CpGRP; 
      ZielGRP = reichweite.ZielGRP; 
      Benutzer = reichweite.Benutzer; 

      PointListe = new List<PointListDto>(); 
      foreach (Points item in reichweite.PointListe) 
      { 
       PointListe.Add(new PointListDto(item)); 
      } 
     } 

     [Key] 
     public int ReichweiteID { get; set; } 
     public string Name { get; set; } 
     //[Required] 
     public int Potenzial { get; set; } 
     //[Required] 
     public string Geschlecht { get; set; } 
     //[Required] 
     public int CPGRP { get; set; } 
     public int ZielGRP { get; set; } 
     public string Benutzer { get; set; } 

     public virtual List<PointListDto> PointListe { get; set; } 

     public Reichweite ToEntity() 
     { 
      Reichweite reich = new Reichweite 
      { 
       Id = ReichweiteID, 
       Name = Name, 
       Potenzial = Potenzial, 
       Geschlecht = Geschlecht, 
       CpGRP = CPGRP, 
       ZielGRP = ZielGRP, 
       Benutzer = Benutzer, 
       PointListe = new List<Points>() 
      }; 

      foreach (PointListDto item in PointListe) 
      { 
       reich.PointListe.Add(item.ToEntity()); 
      } 

      return reich; 
     } 

    } 
} 

而且我的數據模型:

1:N的關係

主表是Reichweites

  • 編號
  • 名稱
  • Potenzial
  • Geschlecht
  • CpGRP
  • ZielGRP
  • Benutzer

子表,點

  • 編號
  • GRP
  • RW_TV
  • Cost_TV
  • Rw_ZuWGS
  • Cost_I_Rea
  • ReichweiteId FK

我想以這種格式提供數據:

[ 
    { 
    "User":"testuser", 
    "CPGRP":21321321, 
    "Sex":"men",  
    "Name": "test", 
    "Potenzial":213213, 
    "ReichweiteID":0, 
    "ZielGRP": 21321321 
    "PointList":[ 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.603",  
         "RW_Zuwgs":"9.603", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         }, 
         { 
         "Cost_I_Rea":"22202771.01", 
         "Cost_TV":".0" , 
         "GRP":10, 
         "ID":0, 
         "ReichweiteID_F":1, 
         "RW_TV":"9.61103", 
         "RW_Zuwgs":"9.6043", 
         } 
       ] 
    } 
] 

一些額外的要求是,我必須fiter ID和用戶名。

這是我現在如何嘗試,但它不工作。

你需要什麼來更好地理解我的問題?

[responseTyp的(typeof運算(Reichweite1Dto))]

public async Task<IHttpActionResult> GetReichweite(int id) 
{ 
    var reich = await db.Points.Include(b => b.ReichweiteId) 
     .Select(b => 
     new ReichweitePointsDto() 
     { 
      Benutzer = b.Reichweite.Benutzer, 
      Name = b.Reichweite.Name, 
      Geschlecht = b.Reichweite.Geschlecht, 
      CPGRP = b.Reichweite.CpGRP, 
      Potenzial = b.Reichweite.Potenzial, 
      ZielGRP = b.Reichweite.ZielGRP, 
      PointListe = (from item in reich 
          select new Points() 
           { 
            GRP = item.GRP, 
            RW_TV = item.RW_TV, 
            Cost_TV = item.Cost_TV, 
            Rw_ZuWGS = item.RW_Zuwgs, 
            Cost_I_Rea = item.Cost_I_Rea, 
           }).ToList() 
      }; 
     return reich; 
} 
+0

我不明白這個問題,你到底有什麼麻煩?一旦你用數據填充模型,你所要做的就是在控制器this.Json(帝國);它會將c#對象轉換成JSON,就像你一樣 – 2014-10-27 13:29:41

+0

我不知道我該如何編寫獲取數據的get方法,比如json示例 – 2014-10-27 13:34:11

+0

我的意思是,你是否已經正確地返回了所有數據c#對象?並只需要它轉換爲JSON? – 2014-10-27 13:58:34

回答

1

是的,我有。關鍵是保持簡單。非常感謝斯科特。

現在我的方法工作正常,並提供我想要的Json格式的數據!

此處的方法:

namespace xms_ef_vers1.Controllers 
    { 
     public class TVKurveController : ApiController 
     { 
      private ReichweitenKurveContext db = new ReichweitenKurveContext(); 


      // GET api/TVKurve/5 
      public IHttpActionResult GetReichweite(int id) 
      { 
       var obj = db.Reichweites.Where(r => r.Id == id && r.Benutzer == user.identity.name); 
       return Ok(obj); 
      } 

      ///////////////////// 
      // GET api/TVKurve 
      [ResponseType(typeof(ReichweitePointsDto))] 

      public IEnumerable<Reichweite> GetReichweite() 
      { 
       var obj = db.Reichweites.Take(100); 
       return obj; 
      } 
     } 
    } 

有人失蹤的WebApiConfig.cs:

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.Objects; 

config.Formatters.Remove(config.Formatters.XmlFormatter); 

在這裏,結果會如何:

[ 
    { 
     "$id": "1", 
     "PointListe": [ 
      { 
       "$id": "2", 
       "Reichweite": { 
        "$ref": "1" 
       }, 
       "Id": 2771, 
       "GRP": 10, 
       "RW_TV": 1000, 
       "Cost_TV": 15600, 
       "Rw_ZuWGS": 1000, 
       "Cost_I_Rea": 15.6, 
       "ReichweiteId": 21 
      }, 
      { 
       "$id": "3", 
       "Reichweite": { 
        "$ref": "1" 
       }, 
       "Id": 2772, 
       "GRP": 20, 
       "RW_TV": 2000, 
       "Cost_TV": 31200, 
       "Rw_ZuWGS": 1000, 
       "Cost_I_Rea": 15.6, 
       "ReichweiteId": 21 
      }, 
      { 
       "$id": "4", 
       "Reichweite": { 
        "$ref": "1" 
       }, 
       "Id": 2773, 
       "GRP": 30, 
       "RW_TV": 3500, 
       "Cost_TV": 46800, 
       "Rw_ZuWGS": 1500, 
       "Cost_I_Rea": 10.4, 
       "ReichweiteId": 21 
      }, 
      { 
       "$id": "5", 
       "Reichweite": { 
        "$ref": "1" 
       }, 
       "Id": 2774, 
       "GRP": 40, 
       "RW_TV": 4500, 
       "Cost_TV": 62400, 
       "Rw_ZuWGS": 1000, 
       "Cost_I_Rea": 15.6, 
       "ReichweiteId": 21 
      } 
     ], 
     "Id": 21, 
     "Name": "Short Curve", 
     "Potenzial": 132132132, 
     "Geschlecht": "men", 
     "CpGRP": 1560, 
     "ZielGRP": 1560, 
     "Benutzer": "admin" 
    } 
] 

也許你可以告訴我是什麼「$ id」和「$ ref」是。

非常感謝你

+0

在發佈之前將德語轉換爲英語也有很大幫助 – 2014-10-28 19:37:33

0

如果我理解正確形成你的意見,你說你已經讓所有的數據就好了 - 你只需要它轉換成JOSN

簡單的只是改變了控制器動作表格的最後一行:

return reich; 

到:

return this.Json(reich); 

MVC和的WebAPI都內置JSON序列化

試試這個:

public IHttpActionResult GetReichweite(int id) 
     { 
      var obj = db.Points.Take(100);     
      return Ok(obj); 
     } 

應該simpify事情升技

+0

不工作。在方法出錯了。(來自帝國的項目 選擇新的點()'帝國紅色下劃線「缺少deklaration 「 – 2014-10-27 14:28:12

+0

是的 - 你的整個查詢看起來並不像你寫它的方式那樣工作,我不確定你的說法,你確實說你已經成功地獲取數據 - 並且詢問如何將這些數據轉換爲JSON - 這裏的答案是如何做到這一點 – 2014-10-27 16:31:37

+0

對不起我失敗了,你能幫我獲取我需要的數據嗎? – 2014-10-27 16:55:10