Другие ответы полны анти-паттернов. Потребность в операторах переключения (особенно часто повторяемых) выглядит как возможность двигаться в направлении ООП.
Я не рефакторинг всего этого, но просто чтобы дать вам идею.
public class SearchHelper
{
//why does this need to return the model at all? the model isn't altered
//and would already be in scope for whatever is calling this method
public static void GetSearchResults(SearchModel model)
{
List<ResultModel> results = new List<ResultModel>();
try
{
using (SqlConnection conn = new SqlConnection("connection string"))
{
conn.Open();
using (SqlCommand cmd = AdoBase.GetSqlCommand(model.SqlCommandName, conn))
{
//this will mutate the object, so you don't need a return type. I'd suggest refactoring this further.
model.BuildSqlCommand(cmd);
using (SqlDataReader reader = cmd.ExecuteReader())
{
//your code sample wasn't returning this, but maybe you intended to?
BuildResultSet(reader);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
private static IEnumerable<ResultModel> BuildResultSet(SqlDataReader reader)
{
var results = new List<ResultModel>();
if (!reader.HasRows) { return results; }
while (reader.Read())
{
ResultModel result = new ResultModel();
// ...the result composition would need to be refactored in a similar way as well
results.Add(result);
}
return results;
}
}
public abstract class SearchModel
{
public string SqlCommandName { get; private set; }
private SearchModel() { }
protected SearchModel(string sqlCommandName)
{
SqlCommandName = sqlCommandName;
}
public abstract void BuildSqlCommand(SqlCommand command);
}
public class UserSearchModel : SearchModel
{
public string Name { get; set; }
public string Username { get; set; }
public UserSearchModel() : base("GeneralUserSearch")
{
}
//warning...this mutates the input parameter
public override void BuildSqlCommand(SqlCommand command)
{
if (!string.IsNullOrWhiteSpace(Name))
{
command.Parameters.AddWithValue(nameof(Name), Name);
}
if (!string.IsNullOrWhiteSpace(Username))
{
command.Parameters.AddWithValue(nameof(Username), Username);
}
}
}
При таком подходе требуется меньше обслуживания, потому что вам не придется изменять множество различных операторов переключения, если вам нужно подключить другой тип модели, и его легче определить, где логика для данного типа поиска жизни. Тем не менее, я не фанат мутации входного параметра, и думаю, что это может быть изменено в дальнейшем.
Тем не менее, вы можете видеть, как это субъективно и может быть неуместным для SO. Кажется, здесь есть проблема с фундаментальным дизайном.
Насколько я знаю, что естественный язык Степенного множества, обрабатывающий поисковую систему, разрабатывается с помощью erlang.
Вы смотрели на couchdb (который записан в erlang также) как возможный инструмент, чтобы помочь Вам решить немного проблем на своем пути?
В 'rdbms' contrib, существует реализация алгоритма стемминга Портера. Это никогда не интегрировалось в 'rdbms', таким образом, это в основном просто находится там. Мы использовали его внутренне, и это работало вполне хорошо, по крайней мере, для наборов данных, которые не были огромны (я не протестировал его на огромных объемах данных).
Соответствующие модули:
rdbms_wsearch.erl
rdbms_wsearch_idx.erl
rdbms_wsearch_porter.erl
Затем существует, конечно, платформа MapReduce Дискотеки.
Можно ли сделать самый быстрый механизм там, я не мог бы сказать. Существует ли рынок для более быстрой поисковой системы? У меня никогда не было проблем со скоростью, например, Google. Но поисковое средство, которое увеличило мои возможности нахождения хороших ответов на мои вопросы, заинтересует меня.
Я рекомендовал бы CouchDB вместо Mnesia.
ОТКЛОНЕНИЯ ОТ КУРСА довольно хороши. Необходимо также рассмотреть MochiWeb.
Вы не пойдете не так, как надо с Erlang