2013-05-07 79 views
0

我有这样的代码:为什么Linq查询将我的Arithabort选项设置为false?

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保持其原始价值。但是,这并不说明(一)这是为什么,和(b)为什么它仍在运行更长的大约10倍它需要在SSMS ...

+0

它可能是你的MyDataContext启动一个事务并在Dispose结束事务?所以当某些事情失败时,你的命令会被回滚。 – wonko79 2013-05-07 14:13:08

+0

@ wonko79 - Arithabort在处置前重置。 – 2013-05-07 14:18:15

+0

你也尝试在自己的上下文中执行命令,然后在自己的上下文中查询。 – wonko79 2013-05-07 14:43:07

回答

1

这似乎是一个已知的问题,EF组Arithabort关闭。出于某种原因,ExecuteStoreCommand不工作,而下面的代码做的工作:

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

this answerthis question更多。

相关问题