2016-08-19 5 views
3

Wenn ich diese Liste bekamLINQ Gruppierung von mit LEFT JOIN Ergebnisse

PersonPhone

------------------------------------------------------------ 
| **PersonId** |**Name** | **PhoneId** | **PhoneNumber** | 
------------------------------------------------------------ 
|    1 | John Doe |   1 | 111-55-5855  | 
------------------------------------------------------------ 
|    1 | John Doe |   2 | 111-55-5521  | 
------------------------------------------------------------ 
|    2 | Mary Jane|   3 | 254-565-855  | 
------------------------------------------------------------ 
|    3 | J. Watson|   NULL|    NULL| 
------------------------------------------------------------ 

ich zu diesem Objekt Mapping benötigen:

public class PersonContactInfo { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<string> Phones { get; set; } 
} 

Mit LINQ, wie kann ich eine Zeile für jede Person bekommen, mit seinen Telefonen in einer Liste und Paging?

Ich habe bereits eine Abfrage, welches Ergebnis ist wie die PersonPhone Ergebnismenge, aber ich weiß nicht, wie Gruppierung von PersonId und dann alle PhoneNumbers Liste und Paging beizutreten. Zum Beispiel, wenn ich eine Seitengröße von drei möchte, wie man eine SQL-Abfrage zu John Doe, Mary Jane und J. Watson mit ihren Telefonen zu machen, wenn die tatsächliche Abfrage 4 Zeilen zurückgibt?

Hinweis: Ich bin nicht (und kann nicht) mit Entity Framework, was ich tue ist und SQL-Abfrage, die eine Liste von PersonPhone füllen, genau wie EF tut.

Antwort

1

Anwendung ein group by:

var query= PersonPhoneSet 
      .GroupBy(p=>new {p.PersonId, p.Name}) 
      .Select(g=> new PersonContactInfo 
         { 
          Id=g.Key.PersonId, 
          Name=g.Key.Name, 
          Phones= g.Select(p=>p.PhoneNumber).ToList() 
         } 
        ); 
+0

Wenn ich mehr Felder haben, muss ich durch alle diese Felder in der Gruppe setzen? –

+0

Nun, wenn diese Felder dieselben Werte wie diese beiden haben und Sie diese Eigenschaften als Teil Ihrer Projektion speichern wollen, ist es meiner Meinung nach bequem, dies auf diese Weise zu tun. Ein anderer Weg könnte sein, zB 'g.First(). Name', um das erste Element der Gruppe zu erhalten und den benötigten Wert zu erhalten. – octavioccl

+0

Danke, ich habe dein Beispiel mit First() verfolgt und jetzt funktioniert es. –