为什么Linq查询设置我的算术中止选项为假

本文关键字:选项 Linq 查询 设置 我的 为什么 | 更新日期: 2023-09-27 18:12:41

我有这样的代码:

using (var db = new MyDataContext()) {
  db.ExecuteStoreCommand("Set Arithabort on");
  var q = AFairlyComplexQuery(db); // returns an IQueryable<>
  var result = q.ToList();  // Line 4
  return result;
}

我发现这个查询超时了。我运行SQL Profiler,抓取SQL并在SSMS中运行,它在7秒内返回。根据过去的经验,我了解到这总是由于将Arithabort选项设置为0而导致的,这就是我运行第一个命令的原因。但还是超时了

我在第4行放了一个断点。当我遇到断点时,我转到SSMS,并运行以下查询:

SELECT arithabort, * FROM sys.dm_exec_sessions s
WHERE program_name LIKE 'MyProg%'

如预期,Arithabort被设置为1。然后我跨过第4行,立即回到SSMS运行那个查询……突然间,Arithabort又变回了0 !

为什么?如何解决这个问题?

编辑:嗯,我找到了一个变通方法,它或多或少是一个答案,但不是很令人满意。

using (var db = new MyDataContext()) {
  db.Connection.Open(); // INSERTING THIS LINE PRESERVES ARITHABORT
  db.ExecuteStoreCommand("Set Arithabort on");
  var q = AFairlyComplexQuery(db); // returns an IQueryable<>
  var result = q.ToList();  // Line 4
  return result;
}

插入一行db.Connection.Open()。现在Arithabort保持原来的值。但这并不能解释(a)为什么会这样,(b)为什么它的运行时间仍然是SSMS中运行时间的大约10倍…

为什么Linq查询设置我的算术中止选项为假

这似乎是一个已知的问题,EF设置Arithabort关闭。由于某种原因,ExecuteStoreCommand不起作用,而下面的代码可以工作:

var cmd = ((EntityConnection)db.Connection).StoreConnection.CreateCommand();
cmd.Connection.Open();
cmd.CommandText = "set arithabort on";
cmd.ExecuteNonQuery();