2012-02-03 28 views
13

tarafından sipariş Aşağıdaki listesine sahiplinq grup,

Ne yapmak ister aynıdır Sayaç, SrvID ilk değeri elde sonra göre küçükten büyüğe kimliğine göre sipariş ve etmektir
ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
5 34  66M Keith 
3 55  45Q Jason 
2 45  75W Mike 
4 33  77U Will 

(eğer varsa). Sayaç ve SrvID ben kimliği 1 ilk I geldi kimliğe 1 için vardı ama ne özdeş olduğu gibi 5 kimliği listesinden kaldırılır nasıl

ID Counter SrvID FirstName 
-- ------ ----- --------- 
1 34  66M James 
2 45  75W Mike 
3 55  45Q Jason 
4 33  77U Will 

Not:

Yani çıkış gibi bir şey olurdu 5.

kaldırıldı Bu yapmak ama çalışmıyor olacaktınız

var result = (from ls in list1 
        group ts by new {ls.Counter, ls.SrvID} 
       order by ls.ID 
        select new{ 
          ls.ID, 
          ls.Counter.FirstOrDefault(), 
          ls.SrvID.First, 
          ls.FirstName}).ToList() 
+0

@ChrisWue - biçimlendirmeyi verdiği için teşekkürler. Masaya nasıl biçimlendirdiniz? –

+0

Sadece standart kod biçimlendirme: 4 boşluk girintisi – ChrisWue

cevap

27
list1.GroupBy(item => new { Counter = item.Counter, SrvID = item.SrvID }) 
    .Select(group => new { 
     ID = group.First().ID, 
     Counter = group.Key.Counter, 
     SrvID = group.Key.SrvID, 
     FirstName = group.First().FirstName}) 
    .OrderBy(item => item.ID); 
+0

Cevabınız için teşekkür ederiz. Neden FirstName ve ID'nin yanında bir First() var? –

+1

GroupBy size bir Counter/SrvID öğesini madde aramasına döndürecek, her arama üyesinin bir anahtarı (Counter/SrvID) ve ilişkili öğeleri vardır. Bu nedenle, her arama grubu için, her gruptaki ilk eşleşmeden, Anahtar/Kimlik ve İsim ve Numaradan Sayaç/SrvID ayıklayabilirsiniz. –

+0

@ vc74 Cevabınız için teşekkür ederiz. LINQ ifadesinde neler olup bittiğini detaylandırır mısınız? – BKSpurgeon

18

Kayıtları gruplandırın ve her gruptan bir kazanan seçin.

var query = 
    from record in list1 
    group record by new {record.Counter, record.SrvID } into g 
    let winner = 
    (
    from groupedItem in g 
    order by groupedItem.ID 
    select groupedItem 
).First() 
    select winner; 


var otherQuery = list1 
    .GroupBy(record => new {record.Counter, record.SrvID }) 
    .Select(g => g.OrderBy(record => record.ID).First()); 
+0

Cevabınız için teşekkür ederiz - Eğer var sorgu = list1'de kayıttan nasıl daha fazla açıklığa kavuşturabilir misiniz? Tekrar teşekkürler –

+0

Bu cevabın ilk satırı muhtemelen, gerçek İngilizcede GroupBy kullanımını tanımlamak için gördüğüm en iyi yoldur. – Clint