我需要帮助从web Api获取数据。我使用EF和两个名为"Reichweites"one_answers"Points"(child)的表
这是我的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
- Id
- 名称
- Potenzial
- Geschlecht
- CpGRP
- ZielGRP
- Benutzer
子表是点
- Id
- GRP
- RW_TV
- 成本_TV
- Rw_ZuWGS
- 成本_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":"213213210.0" ,
"GRP":10,
"ID":0,
"ReichweiteID_F":1,
"RW_TV":"9.603",
"RW_Zuwgs":"9.603",
},
{
"Cost_I_Rea":"22202771.01",
"Cost_TV":"213213210.0" ,
"GRP":10,
"ID":0,
"ReichweiteID_F":1,
"RW_TV":"9.61103",
"RW_Zuwgs":"9.6043",
},
{
"Cost_I_Rea":"22202771.01",
"Cost_TV":"213213210.0" ,
"GRP":10,
"ID":0,
"ReichweiteID_F":1,
"RW_TV":"9.61103",
"RW_Zuwgs":"9.6043",
},
{
"Cost_I_Rea":"22202771.01",
"Cost_TV":"213213210.0" ,
"GRP":10,
"ID":0,
"ReichweiteID_F":1,
"RW_TV":"9.61103",
"RW_Zuwgs":"9.6043",
}
]
}
]
另外一个要求是我必须按id和用户名填写。
这就是我现在尝试的方式,但它不起作用。
你需要什么才能更好地理解我的问题?
[响应类型(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;
}
是的,我有。关键是保持简单。非常感谢斯科特。
现在,我的方法工作得很好,并提供了我想要的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"one_answers"$ref"是什么。
非常感谢
如果我从你的评论中正确理解,你会说你已经得到了所有的数据,你只需要将其转换为JOSN
只需更改控制器动作形式的最后一行:
return reich;
至:
return this.Json(reich);
MVC和WebApi已内置JSON序列化程序
试试这个:
public IHttpActionResult GetReichweite(int id)
{
var obj = db.Points.Take(100);
return Ok(obj);
}
这应该简化