2016-11-18 3 views
-1

Ich habe eine Liste von Artikeln. Die Klasse wie folgt aussieht:Group By Linq Ausgabe

public class DeviceControllerDoorInfo 
{ 

    [DataMember] 
    public string DeviceControllerId { get; set; } 
    [DataMember] 
    public string DeviceControllerName { get; set; } 
    [DataMember] 
    public string DoorId { get; set; } 
    [DataMember] 
    public string DoorName { get; set; } 

} 

Und die Daten wie folgt aussieht:

DoorId DoorName ControllerId ControllerName 
------ -------- ------------ -------------- 

Door1 DoorOne C1   C1 
Door2 DoorTwo C1   C1 
Door3 DoorThree C2   C2 

ich es will umgewandelt werden, wie es aussehen.

public class AccessGroupControllerDoorEntity 
{ 
    public string ControllerId { get; set; } 
    public string ControllerName { get; set; } 

    public List<AccessGroupDoorEnity> Doors { get; set; } 
} 

public class AccessGroupDoorEnity 
{ 
    public string DoorId { get; set; } 
    public string DoorName { get; set; } 
} 

Gruppe Durch die ControllerId und dann die Tür Elemente auflisten.

Wie geht das?

Ich habe versucht:

  var controllersId = allDoors.GroupBy(e => e.DeviceControllerId).Select(x => x); 

Aber ist es die Türen als Liste machen?

Ich bin mir nicht sicher. Bitte helfen Sie.

UPDATE

In meinem Data Service

private AccessGroupEntity ConvertDoorsToEntity(DeviceControllerDoorInfo[] allDoors) 
    { 
     // return null if the object is invalid. 
     if (allDoors != null) 
     { 
      AccessGroupEntity entity = new AccessGroupEntity(); 

      entity.ControllerDoorItems = new List<AccessGroupControllerDoorEntity>(); 

      //Convert to requested format instead of the below 

      foreach (var door in allDoors) 
      { 
       entity.DoorItems.Add(new DoorInfoEntity 
       { 
        DoorId = door.DoorId, 
        DoorName = door.DoorName, 
        ControllerId = door.DeviceControllerId, 
        ControllerName = door.DeviceControllerName 
       }); 

      } 

      return entity; 

Aber stattdessen möchte ich entity.ControllerDoorItems wie die unten gruppierten Daten enthalten:

ControllerId -> C1 
    ControllerName -> C1 
    Doors ->   2 Objects 
+3

Sie müssen GroupBy verwenden, wie Sie im Titel angegeben. Mache dir entweder etwas Mühe oder gib an was genau dein Problem hier ist? – CSharpie

+2

Was ist die Frage hier? Bitte klären Sie genau, wonach Sie fragen. Fragen Sie, wie man 'controllersId' zu einer Liste macht? Fragen Sie, wie Sie Ihre Daten gruppieren? Wenn ja, dann sagen Sie uns bitte, wie es aussehen soll "wie es aussieht" ist keine gute Beschreibung, da "es" nicht angegeben ist. "Wie es geht?" ist auch keine gute Problembeschreibung. Was ist "es" hier? –

+0

@ LasseV.Karlsen Finden Sie die aktualisierte Frage. – StrugglingCoder

Antwort

0
DoorId DoorName ControllerId ControllerName 
------ -------- ------------ -------------- 

Door1 DoorOne C1   C1 
Door2 DoorTwo C1   C1 
Door3 DoorThree C2   C2 

Wenn Sie GroupBy(e => e.ControllerId) Es verwenden wird Ret urn zwei Listen (für das obige Beispiel), die die erste Liste hat zwei Elemente, wobei ControllerId ist C1 und eine andere Liste mit einem Element, das seine ControllerId ist C2.

So GroupBy gibt Listen und keine Elemente zurück.

Für Ihre aktualisierte Frage:

List<AccessGroupControllerDoorEntity> grouped = allDoors.GroupBy(e => e.ControllerId) 
     .Select(group => new AccessGroupControllerDoorEntity 
         { 
          DeviceControllerId = group.Key.Id, 
          DeviceControllerName = group.Key.Name, 
          Doors = group.ToList() 
         }); 
+0

@Ich habe die Frage aktualisiert. Könnten Sie bitte finden? – StrugglingCoder

+0

Ich habe meine Antwort aktualisiert –

+0

Aber DeviceControllerDoorInfo enthält keine ControllerId, Es enthält DeviceControllerId aber dann group.key.Id löst Fehler. Ich schätze, da es zwei Türobjekte zurückgibt, für die Key.Id oder Key.Name keinen Sinn ergeben. Kannst du bitte helfen. – StrugglingCoder

0

Sie können versuchen,

  var list= allDoors.GroupBy(x=>new {x.ControllerId ,Name=ControllerName}, 
      (key, group) => new AccessGroupControllerDoorEntity 
      { 
       ControllerId=Key.ControllerId , 
       ControllerName=Key.ControllerName, 
       Doors = group.ToList() 
      })) 
      .ToList();