2008-12-09 20 views
6

Tümü,LINQ-to-SQL CompiledQuery.Compile() ile Güncelle, Sil, Ekle?

Bu nedenle, LINQ-to-SQL'de, bazı şeyleri hızlandırmak için CompiledQueries kullanmaya dönüştürülen tüm seçme sorgularım var. Seçim ifadeleri için şu ana kadar harika çalışıyor, ancak ekleri ekleme, güncelleme veya silme işlemlerini nasıl önceden derleyemediğimi anlayamadım.

eklediğiniz yaparken, silme veya LINQ-SQL için güncellenmesi, Verilen, nesne modelini kullanmak zorunda. Ama belli ki bir yol boyunca bir sorgu oluşturuyor, bu da statik bir üyeye önceden derlemek ve saklamak için iyi olurdu.

Bu mümkün mü? Önceden derlenmediğinde güncellemeler, siler ve ekler gibi LINQ performansı nedir? ne altında ne çok basit ve daha az "dinamik" olduğu için ben büyük bir fark yoktur ...

cevap

8

, bu seçer çok daha hızlı olmaktan görebiliyordu. Linq-To-SQL select sorguları büyük karmaşık ifadeler ağaçları olabilir. Bunları bazen 'derlemek' alabilir. Bu durumda, bir SQL Server'a karşı çalıştırılabilen bazı T-SQL ile birleştirme. Bu nedenle, bir operasyonun sonucunu önbelleğe almak, böylece tekrar kullanılabilir.

Ancak diğer Sil, Update ve Ekle bir ifade ağaç T-SQL dönüştürülecek gerektirmeyen basit işlemler (LINQ kendisi bütün sorgulama hakkında) bulunmaktadır. Bu diğer işlemleri 'sorgular' olarak gerçekleştiren SQL kodunu düşünmek için eğitilmiş olmamız sadece talihsiz bir şey, biz hiçbir bilgi istemiyoruz.

Bu işlemler sadece zaten derlenmektedir DataContext tarafından değil, bu işlevleri gerçekleştirmek için kod dolayısıyla LINQ tarafından tanımlanır.

+0

Serin. Mantıklı. Sanırım LINQ-to-SQL'de Güncelleme ve Silme sorgularının hiçbir zaman karmaşık WHERE maddelerine sahip olmayacağını unutmuşumdur. Her zaman bir kimliğe bağlı olarak sadece Güncelleme/Silme. Benim düşünce bir parçası olduğunu Güncelleme olduğunu düşünüyorum ve Silinme daha karmaşık olabilir - fıkra hiç ... İlginç –

3

Ben sadece üç ekleme eklemek ve yeniden kullanmak için mantıklı olduğunu düşünüyorum çünkü silme son derece basittir (Tablo WHERE Tuşu ...) ve UPDATE yalnızca değiştirilen alanları güncelleştirir ve böylece değişir güncelleme işlemi başına.

[) ilk defa çalıştırmak sonra saklı yordamı yürütme planı önbelleğinde olacak böylece

+0

NEREDE Ve LINQ SQL ekler muhtemelen herhangi olmuyor. Standart SQL'de kesinlikle olabilirler - Güncelleme veya Silme işleminin sonunda devasa karmaşık WHERE ifadesine sahip olabilirsiniz. Ancak LINQ-to-SQL'de sadece birincil anahtarı veya güncel durumu kullanacaksınız. –

0

L2S "Sp_executesql" kullanır Amien. Sonraki işlemler (aynı sorgudan - aynı param değil) derlenmiş planı önbellekten yeniden kullanır. Yani ne soruyorsun, otomatik olarak SQL Server tarafından 'sahne arkasında' ele alınır.

+0

Doğru - yürütme planı açısından. "Precompiling" hakkında konuşuyorum, LINQ'un ifade ağacından SQL'e ayrıldığı kısımdır. CompiledQuery.Compile() yöntemine bakın. –