c# - 在 ASP.NET MVC 中使用临时表

标签 c# tsql asp.net-mvc-3

背景:

我目前正在编写一个 Web 前端,用于分析我们插入到 SQL Server 中的 Web 日志。

一个最基本的功能就是可以通过指定时间范围搜索一组结果(这通常是解决近期流量问题的工具,而不是深度数据挖掘),然后是各种其他字段,例如ClientIP、Uri等

我最初是用 LINQ 做的,但开始对此感到恼火,并决定对我来说,使用 StringBuilder 构建查询并使用 Dapper.NET 会更容易。 .所以我仍然使用为我的表生成的 dmbl(实际上有 31 个表,每天一个,但是一个 View 将它们组合在一起)。然后在我的 Controller 中创建类似这样的查询:

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);

根据传递给 Controller ​​的 GET 参数生成 WHERE 子句,例如:

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;我只是使用 jquery 和 DataTable 插件在 div 中呈现结果,因为结果集通常应该很小。

现在,回答我的问题:

我还想有他的一堆查询,查询上述搜索的结果集(每个服务器有多少命中,平均响应时间等)。

我猜这样做的方法是创建一个包含结果的临时表(因为如果我不这样做,我将不得不为每个查询生成基本结果,例如结果集的响应时间),但由于我是 c# 和 asp.mvc 的新手,所以我不确定它们将如何工作以及如何绑定(bind)到 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;

最佳答案

临时表的持续时间不会超过创建它的数据库 session 。全局临时表可以在数据库 session 之间共享,但根据您的场景,它可能无法预测 session 何时开始和结束,因此可能无法提供可预测的结果。

我建议创建一个真实的表来保存结果并查询它。查询完成后,只需删除所有数据。如果可以使用不同的结果集建立多个连接(因此临时表会更好),那么您可以添加一个 UNIQUEIDENTIFIER 字段作为“键”,用于这组查询的数据集。意思是,在应用程序端生成 GUID,并将其传递到填充真实表的查询中,以便针对它的每个查询都可以将该应用程序生成的值用作附加 WHERE 子句。完成针对该“临时”结果集的所有查询后,根据该 GUID 执行 DELETE。如果出于某种原因,针对特定结果集的查询断开连接并且您不知道最后一个执行的时间,请将 DATETIME 字段添加到结果集中并创建 SQL 代理作业以删除早于 30 或 60 分钟或其他时间的记录.

编辑: 另外,需要明确的是,如果所有查询实际上都是通过单个连接完成的,那么如果您像我认为的那样启用 MARS(多个事件结果集),您可能仍然能够使用临时表MARS 保持一致的 session ,但我不确定,因为我从未使用过它。

关于c# - 在 ASP.NET MVC 中使用临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5635084/

相关文章:

c# - LINQ 查询到 ObservableCollection?

c# - 如何在 ASP.NET c# 中执行多个 ClientScript.RegisterStartupScript?

c# - 如何通过C#将WPF窗口的图标设置为图标文件?

tsql - 何时在SQL Server中使用事务

asp.net - 在ASP.NET MVC中创建对用户的外键引用

asp.net-mvc-3 - ASP.NET MVC3 : Do I need to use a MembershipProvider?

c# - 从没有重复元素的数组字符串中获取随机 8 个元素值

sql - Sql 函数 RAND() 中种子的用途是什么?

sql - 如何将OFFSET/FETCH 和WITH TIES 结合在一起?

asp.net-mvc-3 - ASP.Net MVC 3 RadioButton 没有默认选择