1

現在、次の2つの方法があります。

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();
}
4

4 に答える 4

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;
    }
}
于 2013-01-17T21:47:22.227 に答える
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();
}
于 2013-01-17T21:39:55.357 に答える
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);
}

さまざまなクエリを呼び出すのは非常に簡単になったため、単一のパラメーター化されたメソッドを作成しても意味がありません。

于 2013-01-17T22:07:46.993 に答える
1

どうですか...

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

     tempList = "SELECT timestamp FROM table1";

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

     var total = tempList.Sum();
}

ただし、「有効なクエリ」の部分には明確化が必要です。

于 2013-01-17T21:42:09.420 に答える