У меня есть следующий метод, который я использую в нескольких местах, но он отличается только несколькими разными вещами, поэтому мне было интересно, как я могу его реорганизовать, чтобы иметь его в общем классе и называть его везде.Как я могу реорганизовать этот метод, чтобы я не использовал его в нескольких местах?
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
и paramters добавленные 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 доступна для меня, так что если это может улучшить его, я приветствовать идеи с помощью этого тоже.
Это могло бы быть лучше подходит для codereview.stackexchange.com. –
Как отличается переменная 'query'? Кроме того, почему у вас есть параметр out для общих записей? Вы можете просто подсчитать записи в возвращаемом 'DataTable'. –
@DaveZych - В зависимости от таблицы, которую я выбираю, она обычно будет отличаться чем-то вроде «SELECT * FROM People WHERE» или «SELECT * FROM Countries WHERE» и т. Д. – Xaisoft