如何构建不保存的OData服务导致变量从第二次减少获取时间?

时间:2016-08-04 06:41:24

标签: c# entity-framework web-services soap odata

我开发了一个OData服务,它从数据库中的一个表中获取50000条记录。我的目的是检查&比较OData服务与SOAP Web服务的响应时间。 SOAP中也开发了相同的服务。

在不使用.NET中的EntityFramework的情况下构建OData服务。

现在我的观察是SOAP在所有请求中占用相同的时间。但是,OData服务仅在第一次调用期间比SOAP花费更多时间。后续调用相对较快。

当我调试代码时,我发现OData服务只是第一次访问数据库。通过从保存的变量传递数据来满足后续请求。由于我的表是一个事务表,因此值可能会快速变化,从而可能导致错误的结果。

代码 - :

实体类 - :

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

数据提取 - :

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做同样的事情。

1 个答案:

答案 0 :(得分:2)

你自己造成这种情况。您每次都返回相同的DemoDataSources.Instance.EBAN。