2011-04-14 61 views
3

我只是做了以下內容:我可以看到SQL /正在使用L2S更新多個記錄嗎?

var items = 
    from c in Items 
    where 
      c.Pid == Campaigns.Where(d=>d.Campaign_name=="US - Autos.com").First().Pid 
     && c.Affid == Affiliates.Where(e=>e.Add_code=="CD4729").First().Affid 
    select c; 

然後我想更新字段對所有的結果:

items.ToList().ForEach(c=>c.Cost_per_unit=8); 
SubmitChanges(); 

查詢時,我知道我可以使用:

GetCommand(items); 

查看將要執行的SQL。

但是在提交更改時,我不知道該怎麼做。

我看了看:

GetChangeSet() 

而且我看到有在這種情況下,約18更新。

問題1:使用L2S更新這種方式是否存在效率問題?問題2(也許這應該是一個單獨的問題,但我會在這裏嘗試):有沒有一種通用的方法來監視SQL Server 2008 R2的SQL語句?我想我可以禁用除TCP以外的所有TCP和WireShark端口(如果這些東西甚至可讀),但我希望有更簡單的方法。

+1

2:是的,SQL Server Profiler。它位於SQL Server性能工具下的開始菜單中。它默認顯示所有會話中的所有語句,但您可以過濾自己的語句。 – Rup 2011-04-14 16:38:22

回答

0

查詢時,我知道我可以使用:

GetCommand(items);要查看將要執行的SQL 。

但是在提交更改時,我不知道 該怎麼做。

您可以使用此:

yourContext.Log = Console.Out; 

但我不能肯定,如果這個記錄所有SQL或只是select秒。

對於每個受影響的對象,您的SQL是不同的。 L2S將使用依賴關係來確定必須保存對象的順序(如果順序很重要),則會構造SQL insert,updatedelete語句以保留更改。生成的語句(尤其是update)取決於對象的哪些屬性已更改。特別是沒有辦法查看將要執行的整個批次。

問題1:是否有效率 問題使用L2S更新這種方式?

不,這是任何其他自動數據訪問層將如何執行更新。

問題2(也許這應該是一個獨立的 問題,但我會在這裏嘗試 ):有一個普遍的方式,只是 監視去 SQL Server 2008 R2中的SQL語句?我禁用了除了 TCP和WireShark的端口 ,但我希望有一個更容易的方法。

這應該是另一個問題,但答案是使用一個跟蹤。儘管您可以使用任何版本的SQL Server(包括Express)進行跟蹤,但Express以外的所有版本附帶的SQL Server Profiler工具使得這非常容易實現。如果您想了解更多信息,請隨時就您的具體問題提出另一個問題。

1

DataContext有一個Log屬性,您可以將其掛接到轉儲已執行的SQL。還有Linq To Sql Profiler這真棒。

0

關於效率 - 當然,有更高效的方式來執行更新,因爲它存在於您的問題中;例如,像這樣的SQL查詢會更有效率(不會執行SELECT查詢,執行代碼以將數據從SQL中拖到一組對象中,執行代碼以對對象執行更新,執行代碼確定哪些對象執行生成相應的SQL語句和UPDATE查詢SQL服務器上執行)改變,代碼:

UPDATE Items SET Cost_per_unit = @CostPerUnit 
FROM Items 
    JOIN Campaigns ON ... 
    JOIN Affiliates ON ... 
WHERE ... 

但LINQ到SQL不提供建立這樣的查詢的任何方式。如果您要以與您的問題類似的非常簡單的方式更新數千行,則可以更好地運行類似於此的SQL語句。如果沒有多行更新或者邏輯更復雜,那麼將它保存在Linq to SQL中。