如何在ExecuteQueryDynamic上的LinqPad上设置查询超时?

Bas*_*mme 7 c# linqpad

如何在ExecuteQueryDynamic上的LinqPad上设置查询超时?

Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM MyDb.dbo.{viewName}");
Run Code Online (Sandbox Code Playgroud)

我想使用此超时来检测太慢的视图。对于每个视图,我都要求一个计数,但是当计数花费太多时间时,我就停止它并计数下一个。

这是我完整的LINQPad代码

void Main()
{
    // In case of error "There is already an open DataReader associated with this Command which must be closed first."
    // /sf/ask/424353471/
    // Add MultipleActiveResultSets=true to connection string. 

    var biewsCount = b.V_sysobjects.Where(v => v.Type == "V").Count();
    var bViewsDetail = Util.OnDemand<List<SysObject>>("Get Views Detail", () => GetViewsDetail("b", b.V_sysobjects.Where(v => v.Type == "V").Select(v => v.Name).ToList()));
    bViewsDetail.Dump();
}

public List<SysObject> GetViewsDetail(string database, List<string> objectNames)
{
    var result = new List<SysObject>();
    foreach (var name in objectNames)
    {
        Console.Write($"{database}.dbo.{name}");
        // I should add a timeout stuff here or before
        var count = (int)Util.CurrentDataContext.ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Select(y => y).Single();
        Console.Write($" {count}\n");
        result.Add(new SysObject
        {
            Database = database,
            ObjectName = name,
            Rows = count
        });
    }
    return result;
}

public class SysObject
{
    public string Database { get; set; }
    public string ObjectName { get; set; }
    public string ObjectType { get; set; }
    public string IndexName { get; set; }
    public long Rows { get; set; }
    public long? TotalPages { get; set; }
    public long? UsedPages { get; set; }
    public long? DataPages { get; set; }
    public long? TotalSpaceMB { get; set; }
    public long? UsedSpaceMB { get; set; }
    public long? DataSpaceMB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*ari 5

这是LINQPad中的错误。该ExecuteQueryDynamic方法应尊重DataContext的要求CommandTimeout

现在,此问题已得到修复(从5.37.4开始,当前为Beta)。

请注意,Util.CurrentDataContext除非包含方法是静态的,否则这是多余的。这Select(y=>y)也是多余的。因此,在您的示例中,您可以执行以下操作:

CommandTimeout = 1;
var count = (int)ExecuteQueryDynamic($"SELECT count(*) FROM {database}.dbo.{name}").Single();
Run Code Online (Sandbox Code Playgroud)


Ari*_*rif 1

据我所知,除了在客户端中设置命令或连接超时之外,无法更改服务器中查询的超时。

你可以试试这个方法,对我来说效果很好:

在运行实际查询之前,为您的查询设置它

SET LOCK_TIMEOUT 1000;   --1 second
Run Code Online (Sandbox Code Playgroud)

运行查询后将其设置回原始值。运行查询的默认值为600秒。