Справочная информация:
В настоящее время я пишу веб-интерфейс для анализа наших веб-журналов, которые вставляются в SQL Server.
Одна из самых основных функций заключается в том, что вы можете искать набор результатов, указав временные рамки (обычно это инструмент для устранения неполадок недавнего трафика, а не глубокого анализа данных), а затем различные другие поля, такие как ClientIP, Uri и др.
Первоначально я делал это с помощью LINQ, но начал раздражаться из-за этого и решил для меня, что будет проще создавать запросы со StringBuilder и использовать Dapper.NET . Так что я все еще вижу dmbl, сгенерированный для моей таблицы (на самом деле есть 31 таблица, по одной на каждый день, но представление объединяет их). И затем создать запросы в моем контроллере, которые идут что-то вроде:
public ActionResult Index(SearchParams sp)
{
var db = new LogTableDataContext();
var query = new StringBuilder();
...
var fields = " Time, ClientIp, Method, Uri, Bytes, Server, Tr, TermState, UserAgent, Host ";
query.Append(" SELECT ");
if (sp.top.HasValue)
query.Append(" Top ").Append(sp.top);
query.Append(fields);
query.Append(" from Logs ");
query.Append(" WHERE 1=1 ");
if (wherestrings.HasValue())
query.Append(wherestrings);
var resultsModel = new UberRows { rows = results, generated_query = query.ToString(), query_params = sp.GetPropertyNamesAndValues() };
return View(resultsModel);
Где предложения WHERE генерируются на основе параметров GET, передаваемых в контроллер, что-то вроде:
public string GenerateWhereString()
{
var wherestring = new StringBuilder();
if (this.Uri.HasValue())
wherestring.Append(" AND Uri = @Uri ");
if (this.ClientIp.HasValue())
wherestring.Append(" AND ClientIp = @ClientIP ");
if (this.Server.HasValue())
У UberRows просто есть public List<HAProxyLogViewer.Log> rows;
, и я просто отображаю результаты в div с помощью jquery и плагина DataTable, поскольку наборы результатов, как правило, должны быть небольшими.
Теперь, на мой вопрос:
Что бы мне также хотелось, чтобы у него была куча запросов, которые запрашивают набор результатов вышеупомянутого поиска (сколько обращений к каждому серверу, среднее время ответа и т. Д.).
Я предполагаю, что способ сделать это - создать временную таблицу с результатами (поскольку, если бы я этого не сделал, мне пришлось бы генерировать базовые результаты для каждого из этих запросов по таким вещам, как время отклика для набора результатов ), но так как я новичок в этом, c # и asp.mvc, я не уверен ни в общей картине того, как это будет работать, ни в привязке к MVC, моему ORM и классам dmbl. Предполагая, что я прав насчет временной таблицы, как бы я работал с этим?
Таким образом, чистый SQL будет выглядеть примерно так:
SELECT Time, ClientIp, Method, Uri, Bytes, Server, Tr, TermState, UserAgent, Host
INTO #resultsTable
FROM Logs
WHERE 1=1 AND Time BETWEEN dateadd(minute, -1440, getutcdate()) and getutcdate()
AND UserAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
SELECT Time, ClientIp, Method, Uri, Bytes, Server, Tr, TermState, UserAgent, Host
FROM #resultsTable;
SELECT Server, COUNT(*)
FROM #resultsTable
GROUP BY Server;
SELECT AVG(Tr)
FROM #resultsTable;
DROP TABLE #resultsTable;