在Web API中实现实体框架
我是ASP.NET的新手,创建了接受ID数组作为输入参数并查询Oracle DB的MVC框架Web API,这应该以JSON格式返回结果。我们的查询是像在Web API中实现实体框架
SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY,
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER,
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE
from STCD_PRIO_CATEGORY
where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(X,Y,Z)
其中X,Y,Z是我们将通过为输入值的参数
我创建的API控制器
public class PDataController : ApiController
{
public HttpResponseMessage Getdetails([FromUri] string[] id)
{
List<OracleParameter> prms = new List<OracleParameter>();
string connStr = ConfigurationManager.ConnectionStrings["PDataConnection"].ConnectionString;
using (OracleConnection dbconn = new OracleConnection(connStr))
{
var inconditions = id.Distinct().ToArray();
var srtcon = string.Join(",", inconditions);
DataSet userDataset = new DataSet();
var strQuery = @"SELECT STCD_PRIO_CATEGORY_DESCR.DESCR AS CATEGORY,
STCD_PRIO_CATEGORY_DESCR.SESSION_NUM AS SESSION_NUMBER,
Trunc(STCD_PRIO_CATEGORY_DESCR.START_DATE) AS SESSION_START_DATE
from STCD_PRIO_CATEGORY
where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(";
StringBuilder sb = new StringBuilder(strQuery);
for(int x = 0; x < inconditions.Length; x++)
{
sb.Append(":p" + x + ",");
OracleParameter p = new OracleParameter(":p" + x,OracleDbType.NVarchar2);
p.Value = inconditions[x];
prms.Add(p);
}
if(sb.Length > 0) sb.Length--;
strQuery = sb.ToString() + ")";
using (OracleCommand selectCommand = new OracleCommand(strQuery, dbconn))
{
selectCommand.Parameters.AddRange(prms.ToArray());
using (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand))
{
DataTable selectResults = new DataTable();
adapter.Fill(selectResults);
var returnObject = new { data = selectResults };
var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
ContentDispositionHeaderValue contentDisposition = null;
if (ContentDispositionHeaderValue.TryParse("inline; filename=ProvantisStudyData.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}}}}}}
它完美并返回结果为 {"data":[{"CATEGORY":"Internal Study","SESSION_NUMBER":7,"SESSION_START_DATE":"2015-02-13T00:00:00"}]}
不过想利用该模型在这里实现实体框架和DBContext.I创建的模型类和DataContext类如下
namespace PSData.Models
{ public class StudyDataModel
{ [Key]
public string CATEGORY { get; set; }
public int SESSION_NUMBER { get; set; }
public DateTime SESSION_START_DATE { get; set; }
}}
而且
namespace PSData.Models
{
public class StudyDataContext:DbContext
{
public DbSet<StudyDataModel> details { get; set; }
}}
我不知道如何在控制器中实现它们。当我试图创建一个使用Web API 2 Controller with actions,using Entity Framework
同时选择模型类,它创造控制器
private StudyDataContext db = new StudyDataContext();
// GET: api/StdData
public IQueryable<StudyDataModel> Getdetails()
数据库上下文类我不知道如何着手为返回类型是我在其他控制器的HttpResponseMessage
控制器在哪里我正在返回JSON消息。任何帮助大大增益
你不需要明确地将其转换为json格式。 content negotiation模块和媒体格式化程序将负责根据请求将数据转换为所需的格式(XML/JSON)。默认情况下,它返回JSON。
假设你有一个DTO类这样
public class CategoryDto
{
public string Category { get; set; }
public int SessionNumber { get; set; }
public DateTime SessionStartDate { get; set; }
}
,并在您的操作方法,你可以使用Request.CreateResponse
方法。
public HttpResponseMessage Get()
{
var db = new StudyDataContext();
var data = db.details.Select(x => new CategoryDto {
Category = x.Category,
SessionStartDate = x.SessionStartDate,
SessionNumber = x.SessionNumber }
).ToList();
return Request.CreateResponse(HttpStatusCode.OK, data);
}
谢谢。但其他的东西在控制器中应该都是一样的。与Oracle Connection类似,给出查询 – trx
我以为你想用EF实现替换所有的数据访问代码 – Shyju
是的,我想替换它们。所以我们不需要任何'使用(OracleCommand selectCommand = new OracleCommand(strQuery,dbconn)) selectCommand.Parameters.AddRange(prms.ToArray()); (OracleDataAdapter adapter = new OracleDataAdapter(selectCommand)) { DataTable selectResults = new DataTable(); adapter.Fill(selectResults);'可能我有点困惑 – trx
您需要创建'StudyDataContext'对象,然后才能访问details属性。我建议你在构建大系统之前花费至少30分钟的时间完成EF基础教程。 – Shyju
@Shyju是我创建的对象作为'私人StudyDataContext db = new StudyDataContext()'所以我明白,如果我使用'返回db.details;'它返回模型类中的所有键。但不知道如何将它们转换为JSON返回 – trx