C# 使用ODATA查询的Web API
我们创建了一个Web API,它将ID数组作为输入参数,并查询Oracle数据库,以JSON格式返回结果。如果返回的数据非常大,则抛出OutOfMemoryException问题。因此,我们计划添加一个额外的查询参数,用于返回数据的列集 在将整个结果集序列化到HttpResponseMessage之前,我们没有将其加载到内存中。我们的查询非常复杂和庞大,它选择了45列。我只是在下面的代码中给出了几个列作为示例C# 使用ODATA查询的Web API,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我们创建了一个Web API,它将ID数组作为输入参数,并查询Oracle数据库,以JSON格式返回结果。如果返回的数据非常大,则抛出OutOfMemoryException问题。因此,我们计划添加一个额外的查询参数,用于返回数据的列集 在将整个结果集序列化到HttpResponseMessage之前,我们没有将其加载到内存中。我们的查询非常复杂和庞大,它选择了45列。我只是在下面的代码中给出了几个列作为示例 using PSData.Models; namespace PSData.Con
using PSData.Models;
namespace PSData.Controllers
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))
{
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,
STCD_PRIO_CATEGORY_DESCR.START_DATE AS SESSION_START_TIME ,
Trunc(STCD_PRIO_CATEGORY_DESCR.END_DATE) AS SESSION_END_DATE,
STCD_PRIO_CATEGORY_DESCR.END_DATE AS SESSION_END_TIME,
Round((TO_DATE (TO_CHAR (STCD_PRIO_CATEGORY_DESCR.END_DATE, 'dd/mm/yyyy hh24:mi'),'dd/mm/yyyy hh24:mi') - TO_DATE (TO_CHAR (STCD_PRIO_CATEGORY_DESCR.START_DATE, 'dd/mm/yyyy hh24:mi'),'dd/mm/yyyy hh24:mi'))*1440)AS SESSION_DURATION_MINUTES
from STCD_PRIO_CATEGORY
where STCD_PRIO_CATEGORY_DESCR.STD_REF IN(";
var sb = new StringBuilder(strQuery);
for (int x = 0; x < inconditions.Length; x++)
{
sb.Append(":p" + x + ",");
var p = new OracleParameter(":p" + x, OracleDbType.NVarchar2);
p.Value = inconditions[x];
prms.Add(p);
}
if (sb.Length > 0) sb.Length--;
strQuery = sb.Append(")").ToString();
var returnObject = new { data = new OracleDataTableJsonResponse(connStr, strQuery, prms.ToArray()) };
var response = Request.CreateResponse(HttpStatusCode.OK, returnObject, MediaTypeHeaderValue.Parse("application/json"));
ContentDispositionHeaderValue contentDisposition = null;
if (ContentDispositionHeaderValue.TryParse("inline; filename=PSData.json", out contentDisposition))
{
response.Content.Headers.ContentDisposition = contentDisposition;
}
return response;
}
我知道在使用IQueryable的ODATA中有这些关键字top
和skip
,因此API调用是
http://localhost:9658/api/values?$top=2&$skip=2
我不确定如何在我的方法中实现上述功能,我创建了如下的模型类
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; }
public DateTime SESSION_START_TIME { get; set; }
public Nullable<DateTime> SESSION_END_DATE { get; set; }
public Nullable<DateTime> SESSION_END_TIME { get; set; }
public string DOSE_ACTIVITY { get; set; }
public Nullable<decimal> SESSION_DURATION_MINUTES { get; set; }
}
}
名称空间PSData.Models
{
公共类StudyDataModel
{
[关键]
公共字符串类别{get;set;}
公共int会话_编号{get;set;}
公共日期时间会话\u开始\u日期{get;set;}
公共日期时间会话\u开始\u时间{get;set;}
公共可空会话\u结束\u日期{get;set;}
公共可空会话\u结束\u时间{get;set;}
公共字符串DOSE_活动{get;set;}
公共可空会话\u持续时间\u分钟数{get;set;}
}
}
及
名称空间PSData.Models
{
公共类StudyDataContext:DbContext
{
公共数据库集详细信息{get;set;}
}
}
但我不知道如何在我的实际控制器中实现它们。非常感谢您的帮助
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; }
public DateTime SESSION_START_TIME { get; set; }
public Nullable<DateTime> SESSION_END_DATE { get; set; }
public Nullable<DateTime> SESSION_END_TIME { get; set; }
public string DOSE_ACTIVITY { get; set; }
public Nullable<decimal> SESSION_DURATION_MINUTES { get; set; }
}
}
namespace PSData.Models
{
public class StudyDataContext:DbContext
{
public DbSet<StudyDataModel> details { get; set; }
}
}