C# 使用ODATA查询的Web API

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

我们创建了一个Web API,它将ID数组作为输入参数,并查询Oracle数据库,以JSON格式返回结果。如果返回的数据非常大,则抛出OutOfMemoryException问题。因此,我们计划添加一个额外的查询参数,用于返回数据的列集

在将整个结果集序列化到HttpResponseMessage之前,我们没有将其加载到内存中。我们的查询非常复杂和庞大,它选择了45列。我只是在下面的代码中给出了几个列作为示例

 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; }
   }
}