2012-05-10 13 views
6

2 bölüm anahtarına sahip bir tablom var; Bir ID sütunu ve bir sürüm numarası. Kayıtların sadece en son sürümünü seçmeye çalışıyorum.Neden bu LINQ Grubu değil vb.net satırları toplayarak?

GROUP BY elde etmek için LINQ ifade stilini kullanmaya çalışıyorum ve Sürümün toplam MAX değerini dışarı çekiyorum. Ancak, hiçbir toplama gerçekleşmiyor.

Özet Kodu:

From C In Credentials 

Group Join .... 
Group Join .... 

Group C.CredentialID, NE.ClientID, C.Version By 
    NE.ClientID, C.CredentialID Into CGroup = Group 
From CG In CGroup 

Select New With { 
    .ClientID = CG.ClientID, 
    .CredentialID = CG.CredentialID, 
    .MaxVersion = CGroup.Max(Function(p) p.Version) 
} 

Gerçek Sonuçlar:

ClientID CredentialID MaxVersion 
1196  1   3 
1196  1   3 
1196  1   3 
1196  2   1 

İstenilen Sonuçlar:

ClientID CredentialID MaxVersion 
1196  1   3 
1196  2   1 

Ayrıca çalıştı, aynı sonuçları:

Group C By Key = New With 
    {Key NE.ClientID, Key C.CredentialID} Into CGroup = Group 
From CG In CGroup 

Select New With { 
    .ClientID = Key.ClientID, 
    .CredentialID = Key.CredentialID, 
    .MaxVersion = CGroup.Max(Function(p) p.Version) 
} 

ben eşleşen özelliklerini ve özel sıralama/gruplama fonksiyonları ile özel sınıfları oluşturma içerir olmayan bir çözüm arıyorum ve kuyruk ucunda lambda ifadeleri kullanmaz Sorunun

Teşekkürler!

cevap

3
From CG In CGroup 

Bu hat Queryable.SelectMany çağırır ve grupları açar. Gruplarınızı açmayın!

o satırı çıkarıp ile sona: Ben zamanında ve LINQPad bu hata var

Select New With { 
    .ClientID = CGroup.Key.ClientID, 
    .CredentialID = CGroup.Key.CredentialID, 
    .MaxVersion = CGroup.Max(Function(p) p.Version) 
} 
+0

Vay, Gününüzü Kaydetme Yolu –

+0

Bu önemli bilgi birikimini nerede öğrendiğinizi sorabilir miyim? –

+0

Temelde System.Linq.Enumerable ve System.Linq.Queryable için msdn başvurularının üzerine dökülmesinden. Lambda sözdizimini kullanmaktan korkmayın, derleyici yazdıklarınızı yine de ona çevirir. –

1

Sorun, anahtar için tanımlanan anonim sınıfın, eşitliği istediğiniz şekilde değerlendirmemesidir. Bunun yerine, anahtar için bir Tuple kullanabilirsiniz:

From C In Credentials 
... 
Group C.CredentialID, NE.ClientID, C.Version By key = 
     New Tuple(Of Integer, Integer)(NE.ClientID, C.CredentialID) 
     Into CGroup = Group 
Select New With { 
     .ClientID = key.Item1, 
     .CredentialID = key.Item2, 
     .MaxVersion = CGroup.Max(Function(p) p.Version) 
} 
+0

: "Sadece parametresiz kurucular ve ilklendiriciler LıNQ varlıkları desteklenir" –

+0

Oh, sadece Linq2Objects ile çalıştım. Korkarım ki, bu durumda başka sınıfları kötüye kullanmak istemezseniz, anahtarı tutabilecek küçük bir sınıf oluşturmanız gerekir. –

+0

Nesnelerin Linq'i alakasız. Bu bir EF sorgusudur. Sorgu veritabanına gönderilir ve .net örnekleri ile değerlendirilmez. Anonim grup anahtar örnekleri yoktur ve eşitlik semantiği kullanılmaz. –