2017-01-12 2 views
1

Ich möchte nur einzelne LINQ-Abfrage verwenden, um geschachtelte Listen in DB-Entitäten mit EntityFramework zu füllen.EF6 Einzelne LINQ-Abfrage für verschachtelte Listen

Ich habe 3 Table Entities. Erste Klasse Cities enthält List<Houses> und Houses enthält List<Residents>.

Diese Klassen:

class Cities 
{ 
    long CityId {get;set;} 
    string Name {get;set;} 
    List<House> Houses {get;set;} 

} 

class Houses 
{ 
    long CityId {get;set;} 
    string Address {get;set;} 
    List<Resident> Residents {get;set;} 

} 

class Residents 
{ 
    long HouseId {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 
} 

Was möchte ich so etwas wie das erreichen ist:

var cities = (from city in db.Cities 
       select new // Creating anonymous type to fill List of Houses 
       { 
        CityId = city.CityId, 
        Name = city.Name, 
        Houses = db.Houses.Where(h=>h.CityId == city.CityId) 
            .Select(new // Another anonymous type, but this time this isn't working 
            { 
             HouseId = h.HouseId, 
             Address = h.Address, 
             Residents = db.Residents.Where(r=>r.HouseId == h.HouseId).ToList() 
            }).ToList() 
            .Select(h => new Houses 
            { 
             HouseId = h.HouseId, 
             Address = h.Address, 
             Residents = h.Houses 
            }).ToList() 
       }) 
       .ToList() 
       .Select(c=> new Cities 
       { 
        CityId = c.CityId 
        Name = c.Name, 
        Houses = c.Houses 
       }).ToList() 

Leider The entity or complex type Houses cannot be constructed in a LINQ to Entities Ich erhalte Fehler.

Es funktioniert, nur für Houses = db.Houses.Where(h=>h.CityId ==city.CityId).ToList(). Aber damit verliere ich Residents in Houses.

Ist es sogar möglich, mit einer LINQ-Abfrage zu tun?

+0

Sie in der DB mit einer LINQ-Abfrage schreiben wollen? – Piou

+1

'Residents = h.Houses' muss ein Tippfehler sein. Außerdem wird dringend empfohlen, einzelne Klassennamen zu verwenden. –

Antwort

5

Sie müssen nur Häuser und Bewohner Abfrage in Ihre Städte sind:

var cities = db.Cities.Include(c => c.Houses.Select(h => h.Residents)).ToList(); 
+1

Dies ist am besten, wenn es in Ordnung ist, die Entitätstypen zurückzugeben. Es wird nicht funktionieren, wenn der anonyme Typ nach dem 'Include' und vor dem' ToList' ausgewählt wird. ** edit ** realisierte gerade, dass die Entitätsobjekte aus den anonymen Typen rekonstruiert werden, also ist meine Bemerkung irgendwie redundant :) – grek40

+1

@Sergey_Berezovskiy: Danke. Ich hatte ein paar kleine Probleme mit der korrekten Erstellung der Navigationseigenschaften, aber danach lief alles super! – Wiktor

0

Sie sollten die Navigationseigenschaften, kein separater db Zugang

var Cities = (from city in db.Cities 
      select new // Creating anonymous type to fill List of Houses 
      { 
       CityId = city.CityId, 
       Name = city.Name, 
       Houses = city.Houses.Select(new 
           { 
            HouseId = h.HouseId, 
            Address = h.Address, 
            Residents = h.Residents.ToList() 
           }).ToList() 
           .Select(h => new Houses 
           { 
            HouseId = h.HouseId, 
            Address = h.Address, 
            Residents = h.Houses 
           }).ToList() 
      }) 
      .ToList() 
      .Select(c=> new Cities 
      { 
       CityId = c.CityId 
       Name = c.Name, 
       Houses = c.Houses 
      }).ToList() 

Haben Sie nicht überprüfen ganze Syntax verwenden, nur db.Houses.Where(...) von city.Houses (gleiche mit Residents) ersetzt, so könnte es einige andere Fragen.

Verwandte Themen