VB.NET'in Aggregate
sorgusu, her Into
yan tümcesi ayrı ayrı yürütüldüğünden, birden çok Into
yan tümcesi ile bir Linq ifadesinin ilk (dış) yan tümcesi olarak kullanıldığında hatalı bir şekilde hatalı mıdır?Agrega ölümcül kusurlu mı?
SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant
in LINQ to SQL için "bariz" cevabı Ancak
Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max()
olduğunu bu cevabı aslında Min
ve Max
her alır (ve Count
ve Average
gibi diğer toplu işlevleri eklerseniz) ayrı SQL sorguları . Bu LINQPad'de kolayca görülebilir.
bir işlem (veya başka bir şey atomik bu sorguları yapma) LINQPad tarafından gösterilmeyen var mı, yoksa bu gerçekleşmesini bekleyen bir yarış durumu nedir? (Ve böylece birden agrega döndüren tek bir sorgu zorlamak için yukarıdaki sorunun cevabı gösterilen hile yapmak zorunda.)
Özetle, çoklu agrega döner Aggregate
kullanarak LINQ SQL sorgusu var tek (veya en az "atomik") sorguda çalışır? Bana açık yanıt Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)
, aslında optimize bile, iki kere bütün tabloyu alır ve sonra kullandığı için
(Ben de "bariz" demek sonucu elde etmek Linq varlıkları Min
ve Max
: -()
Ben Aggregate
VB özgü değildi, ama C# bu sorgu ifadesini yok gibi görünüyor, bu yüzden vb.net için .net değiştirdik
Sorguların SQL sunucusunun kendisini izleyerek bir işlemde olup olmadığını doğrulayabilirsiniz, bunu göstermelidir (ancak bu konuda% 100 emin değilim). Ancak, performans temel bir sorun değilse, tüm veri kümesini okuyup daha sonra toplamaya devam etmeniz daha iyidir (temel olarak, verilerin anlık görüntüsünde çalışma). – Alex
Not: Bu, orijinal 'Into Min (p.ZoneMin)' sorgusunun, sorgudaki SQL kısmının aynı olduğunu görmek için optimize edeceğini umduğum şeyi not edin. Belki JITter bunu hala görebiliyordu, ama LINQPad'in/o + yapmadı. –
Ve SQL'in desteklediği işlevlerle yalnızca bir araya toplanırken, veritabanını toplama işlemini yapmak için "sabit bir numaraya göre gruplandırma" yapmak tercih edilir. –