2013-01-17 106 views
1

我目前有兩種方法:結合類似的方法

CalculateDaily() 
{ 
    List<string> tempList; 

    // Effective query. not what is really passed 
    tempList = "SELECT timestamp FROM table1 WHERE date = today"; 

    var total = tempList.Sum(); 
} 

和:

CalculateTotal() 
{ 
    List<string> tempList; 

    // Effective query. not what is really passed 
    tempList = "SELECT timestamp FROM table1" 

    var total = tempList.Sum(); 
} 

我的問題是我應該讓他們分開,或者將它們組合成一個單一的方法可行,運行if檢查?喜歡的東西:

Calculate(bool daily) 
{ 
    List<string> tempList; 

    if(daily) 
      tempList = "SELECT timestamp FROM table1 WHERE date = today"; 
    else 
      tempList = "SELECT timestamp FROM table1"; 

    var total = tempList.Sum(); 
} 
+0

首選的做法是分解和減少耦合,而不是增加複雜性。一種功能,一種責任。但更好的是下面的建議,以結合常見的然後是子類。 – dkretz

回答

2

我會使用提供開始日期和結束日期的方法。然後,無論你喜歡,你都可以使用它。

public static int Calculate(DateTime startDate, DateTime endDate) 
{ 
    string sql = @"SELECT SUM(timestamp) 
        FROM table1 
        WHERE date BETWEEN @startDate AND @endDate"; 
    using(var con=new SqlConnection(connectionString)) 
    using (var cmd = new SqlCommand(sql, con)) 
    { 
     con.Open(); 
     cmd.Parameters.AddWithValue("@startDate", startDate); 
     cmd.Parameters.AddWithValue("@endDate", endDate); 
     int sum = (int)cmd.ExecuteScalar(); 
     return sum; 
    } 
} 
+0

這聽起來像一個非常愚蠢的問題,但它可能參數化正在傳遞到另一個方法的查詢?例如,我寫的查詢被傳遞給實際執行連接和執行的Query()。我在查詢數據庫方面仍然非常新,而且我在白天學到更多東西,但是這無法實現。那,或者我今天沒有足夠的咖啡。 – MyCodeSucks

+0

@TyrionLannister:我不知道你的Query方法。也許它需要帶參數的重載。在我看來,將數據庫功能封裝在數據庫類中幾乎不是一個好主意。就這樣,它是f.e.很難確保連接儘快關閉(就像上面的'using'語句一樣)。它不會增加太多,但可以傷害。 –

1

我會做這種方式:

Calculate(bool daily) 
{ 
    List<string> tempList; 

    tempList = "SELECT timestamp FROM table1" 

    if(daily) 
      tempList += " WHERE date = today"; 

    var total = tempList.Sum(); 
} 

或多個參數的版本(一些僞代碼):

Calculate(bool daily) 
{ 
    List<string> tempList; 

    tempList = "SELECT timestamp FROM table1 WHERE (@Date IS NULL OR date = @Date)" 

    if(daily) 
      @Date = today; 
    else 
      @Date = null; 

    var total = tempList.Sum(); 
} 
1

......怎麼樣

Calculate(bool daily) 
{ 
    List<string> tempList; 

    tempList = "SELECT timestamp FROM table1"; 

    if(daily) 
     tempList += " WHERE date = today";   

    var total = tempList.Sum(); 
} 

雖然「有效查詢」部分需要cl arification。

+0

該查詢是一個被傳遞的示例查詢。它可以是''從table1中選擇名字「'。 – MyCodeSucks

+0

好的,只是想確保你實際上使用內聯SQL而不是翻譯ORM或其他。在那種情況下,出於安全原因,一定要參數化D Stanley指出的參數。 –

1

你可以做一個通用的方法對標量查詢

// Assumes parameter names @0, @1, @2 ... in the query. 
public static T ExecuteScalar<T>(string query, params object[] parameters) 
{ 
    using(var conn = new SqlConnection(myConnectionString)) 
    using (var cmd = new SqlCommand(query, conn)) { 
     for (int i = 0; i < parameters.Length; i++) { 
      cmd.Parameters.AddWithValue("@" + i, parameters[i]); 
     } 
     conn.Open(); 
     return (T)cmd.ExecuteScalar(); 
    } 
} 

然後創建重載方法爲您查詢

public static decimal SumTable1Amount() 
{ 
    return ExecuteScalar<decimal>("SELECT SUM(amount) FROM table1"); 
} 

public static decimal SumTable1Amount(DateTime date) 
{ 
    return ExecuteScalar<decimal>(
     "SELECT SUM(amount) FROM table1 WHERE date = @0", 
     date); 
} 

public static decimal SumTable1Amount(DateTime fistDate, DateTime lastDate) 
{ 
    return ExecuteScalar<decimal>(
     "SELECT SUM(amount) FROM table1 WHERE date BETWEEN @0 AND @1", 
     fistDate, lastDate); 
} 

調用不同的查詢現在是很容易的,所以沒有點再創建一個單一的參數化方法。