2012-09-04 37 views
12

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 için değiştirdik

+0

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

+0

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ı. –

+0

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. –

cevap

0

: Aggregate işlemler olmadan ayrı SQL sorguları üretmek için bozuldu?

Tüm LINQ, sorgularınızı yalnızca tek bir SELECT ile sonuçlanacak şekilde ayarlamamanıza neden olabilir ve bu durum "pes etmeden" mümkün olmamakla birlikte tek bir sorguda daha büyük bir sonuç alındıktan sonra Verileri toplamak veya başka şekilde manipüle etmek için Linq-to-Objects kullanarak. Örneğin, This 'query'.

Genelde, programcıya, birden çok soruna neden olabilecek LINQ sorguları etrafında işlem eklendiğinden emin olmak için. Biz sadece LINQ sorguları birden çok SQL sorguları dönüşebilir hangi kesin bilmemiz gerekir.

1

Alt. hough aşağıdaki sözdizimini kullanarak tek bir sorguda birden fazla işlevi yapabilir, Agrega anahtar kelimeyi kullanmaz:

Dim query = From book In books _ 
    Group By key = book.Subject Into Group _ 
    Select id = key, _ 
     BookCount = Group.Count, _ 
     TotalPrice = Group.Sum(Function(_book) _book.Price), _ 
     LowPrice = Group.Min(Function(_book) _book.Price), _ 
     HighPrice = Group.Max(Function(_book) _book.Price), _ 
     AveragePrice = Group.Average(Function(_book) _book.Price) 

olsa Agrega fıkra uygulanmasıyla ilgili bir sorun var gibi görünüyor. Aşağıdaki sorguyu göz önünde bulundurun: Northwind:

Aggregate o in Orders 
into Sum(o.Freight), 
Average(o.Freight), 
Max(o.Freight) 

Bu sorun 3 veritabanı isteği. İlk iki ayrı toplama maddeleri gerçekleştirir. Üçüncü istemciye tüm tabloyu çeker ve nesneleri Linq yoluyla müşteri, Max gerçekleştirir. Benim daha geniş soruya cevap vermek için

+1

Evet, ve 'Group By key = 0 Into Group' olarak değiştirirseniz (ve '' id = key '' seçeneğini işaretlemezseniz), ben de sorduğum sorunun cevabında açıklanan "sabit bir gruplama" hilesi elde edersiniz tüm tablo üzerinde agrega izin verilen, başvurdu. –

+0

Örneğimde, gruplamayı istiyorum. Bütün masanın üzerinden isterseniz, sabit numaranız iyi çalışır. –

+0

I * düşünüyorum * senin ikinci nokta 'Navlun 'ile ilgili olduğu görülüyor, ve bir sebepten dolayı Linq, SQL'in' MAX''nın Max'in geri dönmesi gerektiğini düşündüğü değere farklı bir değer getirebilir. Ama _3 __separate__ veritabanı istekleri_ sorusu ile ilgili. –