2010-11-19 14 views
0

Üç sütuna sahip bir veritabanında bir tablo var: Ajans Kimliği, Ad ve Değer.LINQ to SQL GroupBy: Tek bir DB gezgisiyle 2 düzey hiyerarşik koleksiyon oluşturma

< Ad, Değer > çiftleri Ajans Kimliği tarafından gruplandırılmış bir koleksiyon almak istiyorum.

Bunu nasıl yapabilirim? Aşağıdakine benzer bir şey denedim, işe yarıyor ama her ajans için bir DB çağrısı yapıyor! Kullanılması zincir sözdizimi olurdu IEnumerable < KeyValuePair < int, IEnumerable <NameValuePair> > >

cevap

1

kolay yolu Bu tür bir sorgulama ile tur açmayı önlemek için istemci tarafında gruplamaktır - .AsEnumerable():

db.AgencyDivisionsENT 
    .Select (x => new { x.AgencyId, x.Name, x.Value }) 
    .AsEnumerable() 
    .GroupBy(...)  // AsEnumerable() forces grouping to happen on the client 
    .ToDictionary(...) 

Bu, hiçbir şekilde verimsizdir - sürece: filtrelemek .Where deyimi gerekirse sadece verileri seçin

  • , ilk .Select açıklamada
  • ile sunucudan gerek Veriler, sadece bir araya getirilmeden önce, ayrıntı satırlarını (bu durumda olduğu gibi) seçmeden önce .AsEnumerable yerine yerleştirilir.
+0

Parlak! .AsEnumerable(), istediğim şekilde çalışmasını sağlayan sihirli tozdur. Teşekkür ederim. – msigman

2

:

from div in db.AgencyDivisionsENT 
     group div by div.AgencyId into NamePairCollection 
     select new KeyValuePair<int, IEnumerable<DivisionResults>>(NamePairCollection.Key, 
      NamePairCollection.Select(k => new DivisionResults 
      { 
        Name = k.Name, 
        Value = k.Value 
       )); 

böyle bir şey ile bitirmek istiyorum

db.AgencyDivisionsENT 
.GroupBy(x=>x.AgencyId) 
.ToDictionary(x=>x.Key, g=>g.Select(x=>new { k.Name, k.Value }).ToArray()); 
+0

Bu yanıt için teşekkürler. GroupBy ve ToDictionary lambdas çok yardımcı oldular. Ancak, bu hala DB'ye (ajans başına bir tane) çok sayıda tur attı. – msigman