2008-12-09 217 views
6

全部,LINQ-to-SQL CompiledQuery.Compile()更新,刪除,插入?

因此,我已將LINQ-to-SQL中的所有選擇查詢轉換爲使用CompiledQueries來加快速度。在選擇語句方面迄今爲止工作良好,但我還沒有弄清楚如何預編譯插入,更新或刪除語句。

當然,在插入,刪除或更新LINQ-to-SQL時,必須使用對象模型。但顯然在某個地方它會生成一個查詢,這對於預編譯並存儲在一個靜態成員中是很好的。

這可能嗎?當LINQ沒有預編譯時,更新,刪除和插入的LINQ性能如何?我可以看到它比選擇快得多,因爲它們在底下做的事情要簡單得多,而且不那麼「動態」......

回答

8

有一個很大的區別。 Linq-To-SQL選擇查詢可以是大型複雜表達式樹。這些可能需要一些時間來編譯。在這種情況下,合併到可以針對SQL Server運行的某些T-SQL。所以緩存操作的結果是可以重用的。

但是其他刪除,更新和插入操作簡單,不需要將表達式樹轉換爲T-SQL(LINQ本身就是查詢)。它只是不幸的,我們已經被訓練去思考執行這些其他操作作爲'查詢'的SQL代碼,我們並不真正要求任何信息。

這些操作僅由DataContext而不是LINQ定義,因此執行這些功能的代碼已經編譯完成。

+0

很酷。說得通。我想我忘記了在LINQ-to-SQL中,更新和刪除查詢永遠不會有複雜的WHERE子句。他們總是隻是根據ID來更新/刪除。 LINQ-to-SQL中的插入可能永遠不會有任何WHERE子句... – 2008-12-10 14:05:37

3

我認爲只有三個插入纔有意義才能編譯和重用,因爲刪除非常簡單(DELETE FROM TABLE WHERE Key ...),並且UPDATE只更新已更改的字段,因此會發生變化每次更新操作。

[)amien

+0

有趣 - 我認爲我認爲的一部分是Update和Deletes可能更復雜。在標準SQL中,它們當然可能是 - 在更新或刪除的末尾可能會有一些巨大複雜的WHERE語句。但是在LINQ-to-SQL中,你只能使用主鍵或更新狀態。 – 2008-12-10 14:03:58

0

L2S使用「sp_executesql的」,所以你運行它第一次之後會在存儲過程的執行計劃緩存。後續運行(相同的查詢 - 不是相同的參數)將重用緩存中編譯的計劃。所以你所要求的是由SQL Server'幕後'自動處理的。

+0

正確 - 就執行計劃而言。我所說的「預編譯」是LINQ從其表達式樹解析成SQL的部分。請參閱CompiledQuery.Compile()方法。 – 2009-08-10 20:37:46