为什么Linq查询将我的Arithabort选项设置为false?

时间:2013-05-07 14:09:13

标签: c# sql-server linq linq-to-entities sql-server-2012

我有这样的代码:

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倍......

1 个答案:

答案 0 :(得分:1)

EF设置Arithabort似乎是一个已知问题。由于某种原因,ExecuteStoreCommand不起作用,而以下代码确实有效:

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

有关详情,请参阅this answerthis question