複数の場所で使用する次のメソッドがありますが、いくつかの点が異なるだけなので、共通のクラスで使用してどこからでも呼び出すことができるようにリファクタリングする方法を考えていました。
public override DataTable GetRecords(QueryContext queryContext, out int totalRecords)
{
// Build Query
//Different
StringBuilder query = new StringBuilder("SELECT * FROM TABLE");
Dictionary<string, string> parameters = new Dictionary<string, string>();
if (queryContext.OrderByColumns.Count == 0)
{
//Can very in length or number of parameters
queryContext.OrderByColumns.Add("param_1"); //different
queryContext.OrderByColumns.Add("param_2"); //different
}
if (queryContext.Parameters.Count > 0)
{
foreach (QueryParameter p in queryContext.Parameters)
{
dataAccess.paramAdd(parameters, query, p.ColumnName, p.Value.ToString());
}
}
// Order By Clause
query.Append(queryContext.OrderByColumns.GetSqlClause());
// Apply Limit
if (queryContext.ApplyLimit)
{
query.AppendFormat(" LIMIT {0},{1}", queryContext.Offset, queryContext.Limit);
}
//Execute the query.
DataSet results = dataAccess.ExecuteQuery(query.ToString(), parameters);
totalRecords = Convert.ToInt32(results.Tables[1].Rows[0][0]);
return results.Tables[0];
}
他の場所での唯一の違いは、query
変数の値と によって追加されるパラメーターですqueryContext.OrdByColumn.Add(...)
。それ以外はすべて同じです。
私の最初のショットは次のようなことをするつもりでした:
public override DataTable GetRecords(StringBuilder query, string[] orderByParams, QueryContext queryContext, out int totalRecords)
{
Dictionary<string, string> parameters = new Dictionary<string, string>();
if (queryContext.OrderByColumns.Count == 0)
{
foreach(var param in orderByParams)
{
queryContext.OrderByColumns.Add(param);
}
}
if (queryContext.Parameters.Count > 0)
{
foreach (QueryParameter p in queryContext.Parameters)
{
dataAccess.paramAdd(parameters, query, p.ColumnName, p.Value.ToString());
}
}
// Order By Clause
query.Append(queryContext.OrderByColumns.GetSqlClause());
// Apply Limit
if (queryContext.ApplyLimit)
{
query.AppendFormat(" LIMIT {0},{1}", queryContext.Offset, queryContext.Limit);
}
//Execute the query.
DataSet results = dataAccess.ExecuteQuery(query.ToString(), parameters);
totalRecords = Convert.ToInt32(results.Tables[1].Rows[0][0]);
return results.Tables[0];
}
LINQ は私が利用できるので、それで改善できる場合は、それを使用したアイデアも歓迎します。