2016-08-04 1 views
1

Я разработал службу OData, которая извлекает 50000 записей из одной таблицы, присутствующей в базе данных. Моя цель - check & сравнить время отклика службы OData с помощью SOAP webservice. Такая же служба была разработана и в SOAP.Как создать службу OData, которая не сохраняет результат в переменных, чтобы уменьшить время выборки во второй раз?

Служба OData построена без использования EntityFramework в .NET.

Теперь мое наблюдение заключается в том, что SOAP принимает одинаковое время во всех запросах. Но служба OData занимает больше времени, чем SOAP только во время первого вызова. Последующие звонки сравнительно быстрее.

Когда я отлаживал код, я обнаружил, что служба OData попадает в базу данных только в первый раз. Последующие запросы выполняются путем передачи данных из этих сохраненных переменных. Поскольку моя таблица является таблицей транзакций, значения могут быстро меняться, что дает, возможно, неверные результаты.

Код -:

Entity класс -:

namespace Demo.Models 
{ 
    public class EBAN 
    { 
     [Key] 
     public String MANDT { get; set; } 
     [Key] 
     public String BANFN { get; set; } 

     [Key] 
     public String BNFPO { get; set; } 

     public String BSART { get; set; } 
     public String BSTYP { get; set; } 
     public String BSAKZ { get; set; } 
     public String LOEKZ { get; set; } 
    } 
} 

данных Fetching -:

using Demo.Models; 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.OracleClient; 

    namespace Demo.DataSource 
    { 
     public class DemoDataSources 
     { 

      private static DemoDataSources instance = null; 
      public int noOfRecords { get; set; } 
      public static DemoDataSources Instance 
      { 
       get 
       { 
        if (instance == null) 
        { 
         instance = new DemoDataSources(); 
        } 
        return instance; 
       } 
      } 
      public List<EBAN> EBAN { get; set; } 
      private DemoDataSources() 
      { 
       this.Reset(); 
       this.Initialize(); 
      } 
      public void Reset() 
      { 
       this.EBAN = new List<EBAN>(); 
      } 
      public void Initialize() 
      { 
       DataTable dt = new DataTable(); 
       OracleCommand cmd = new OracleCommand(); 
       cmd.CommandText = "  Select MANDT,  BANFN,  BNFPO, BSART, bstyp , BSAKZ, LOEKZ  from ctdrdb.t_eban_mm WHERE rownum < = 5"; 

       dt = getDataTableWithParams(cmd); 


       List<EBAN> l = new List<EBAN>(); 
       EBAN e; 

       for (int i = 0; i < dt.Rows.Count; i++) 
       { 

        e = new EBAN() 
        { 
         MANDT = dt.Rows[i]["MANDT"].ToString(), 
         BANFN = dt.Rows[i]["BANFN"].ToString(), 
         BNFPO = dt.Rows[i]["BNFPO"].ToString(), 
         BSART = dt.Rows[i]["BSART"].ToString(), 
         BSTYP = dt.Rows[i]["bstyp"].ToString(), 
         BSAKZ = dt.Rows[i]["BSAKZ"].ToString(), 
         LOEKZ = dt.Rows[i]["LOEKZ"].ToString(), 

        }; 
        l.Add(e); 
       } 


       this.EBAN.AddRange(l); 


      } 

      public DataTable getDataTableWithParams(OracleCommand Orcmd) 
      { 
       OracleConnection conn = new OracleConnection(ConnGetSmsDetail); 
       try 
       { 
        DataTable dt = new DataTable(); 
        OracleDataAdapter da; 

        //OPENING THE CONNECTION 
        if (conn.State == ConnectionState.Closed) 
        { conn.Open(); } 

        Orcmd.Connection = conn; 
        da = new OracleDataAdapter(Orcmd); 
        da.Fill(dt); 
        da.Dispose(); 
        //CLOSING THE CONNECTION 
        conn.Close(); 
        return dt; 
       } 
       finally 
       { 
        conn.Close(); 
       } 
      } 

     } 

    } 

контроллер класса -:

[EnableQuery] 
     public class EBANController : ApiController 
     {  
      public IHttpActionResult Get() 
      { 
       return Ok(DemoDataSources.Instance.EBAN.AsQueryable()); 
      } 

     } 

Как я попал в базу данных всегда, а не хранить в переменных (как это имеет место в службе SOAP), а также уменьшить время отклика как утверждают службы OData. Также как сделать то же самое с помощью Entity Framework.

ответ

2

Вы вызываете это сами. Вы каждый раз возвращаете тот же DemoDataSources.Instance.EBAN.

+0

Можете ли вы указать точную ошибку в коде? А также, как изменить код на меньшее время, чем SOAP-сервис. Я вижу разницу в размере файла (это связано с тем, что файл JSON всегда будет меньшего размера, чем файл XML) –