2016-07-26 75 views
1

我需要通过ADO.Net优化数据访问。为项目requeriments我不能使用Linq或实体...并行运行查询

因此,我推出15个独立ADO.NET查询。我遵循的标准,打开连接,启动查询,使用DataReader获取数据,将它们存储在类中,最后我关闭连接...

但我感觉像项目是不够快。所以,伙计们,你们能否教我一些提高速度的技巧?

我的数据库是SQL Server,并且据我所知,我正在查询实体的查询。

编辑:

private void Connect(string comando) { 
    try { 
     string cadena = "connection_data"; 
     Cn = new SqlConnection(cadena); 
     Cn.Open(); 
     SqlCommand Com = new SqlCommand(comando, Cn); 
     Datos = Com.ExecuteReader(); 
    } 
    catch (Exception e) 
    { 
     // 
    } 
} 

    private void Close() 
    { 
     try 
     { 
      Cn.Close(); 
      Datos.Close(); 
     } 
     catch (Exception e) 
     { 
      // 
     } 
    } 

    public List<class1> getClass1(double id) 
    { 
     Connect("SELECT TOP (5) CASE WHEN [table1].[attribute1] IN (7, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29) THEN 'random_name' " + 
      "WHEN [table1].[attribute3] = NULL AND [table1].[attribute2] = NULL THEN 'random_name2' WHEN [table1].[attribute3] = NULL THEN [table1].[attribute3] ELSE " 
// bla bla bla bla and so on and I have 15 massive queries like this one; 

     List<class1> res = new List<class1>(); 

     if (Datos.HasRows == true) 
     { 
      while (Datos.Read()) 
      { 
       class1obj = new class1(); 
       obj.at1= class1.cont + 1; 
       obj.at2= class1.cont + 1; 
       class1.cont++; 
       obj.at3= "random_value"; 
       obj.at4= Datos.GetValue(0); 
       obj.at5= Datos.GetValue(1); 
       res.Add(obj); 
      } 
      Close(); 
     } 
     return res; 
    } 
+0

您应该显示代码和查询... –

+0

@Gilad Green。为什么?标准代码的标准查询...查询已优化,代码是标准的...无论如何,只是为了如果我错过了一些东西,我编辑它... –

+1

雅我可以理解,但我说关于代码和查询,因为也许你可以加入查询,或者你可以并行执行。在任何情况下,为了确定而不是给出不相关的答案,某些代码是有用的。 –

回答

1

如果你有创建为每个类,那么你可以做什么的功能是这样的:

而是具有功能getClass1有一个接口:

public interface IBuildClass<TClass> 
{ 
    Task<IEnumerable<TClass>> BuildAsync(double id); 
} 

添加接口的基类,该接口将作为依赖项请求连接对象到数据库

public abstract class BuildClassBase<TClass> : IBuildClass<TClass> 
{ 
    public BuildClassBase(SqlConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<IEnumerable<TClass>> BuildAsync(double id) 
    { 
     //Execute query and pass results to InnerBuid 
     return InnerBuildAsync(/*Pass DataTable*/); 
    } 

    public abstract async Task<IEnumerable<TClass>> InnerBuildAsync(DataTable data); 

    //Ctor of each derived class will set the value 
    public string Query { get; protected set; } 
    public SqlConnection Connection {get; set; } 
} 

然后一个特定的实现匹配你想创建的每个类。在你的代码

public interface IBuildClassFactory 
{ 
    IBuildClass<TClass> GetBuilder<TClass>(); 
} 

然后,你目前执行所有的15种方法,你可以为每个类创建一个Task然后await buildClassFactory.GetBuilder<ClassA>().BuildAsync(id):您还可以添加一个工厂他们。例如:

double id = 1; 
Task createClassA = buildClassFactory.GetBuilder<ClassA>().BuildAsync(id); 
Task createClassB = buildClassFactory.GetBuilder<ClassB>().BuildAsync(id); 
Task createClassC = buildClassFactory.GetBuilder<ClassC>().BuildAsync(id); 
.... 

Task.WaitAll(createClassA, createClassB, createClassC....); 

//And then get result from tasks 
+0

Uuuuffff。谢谢@吉拉德格林。看起来可能是工作。至少它会改善我的回应时间。但是这超过了我。我需要时间来实施它。我会让你知道这件事...感谢你的伴侣...你很酷:)))) –

+0

@EliasMP - 带来很多乐趣:)深入研究依赖注入 - 真正改善了代码:)阅读关于它,也许还有关于它的以前的问题。检查Castle Windsor/ninject等IoC容器...... –