2013-05-07 81 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更多。

相關問題