2017-01-12 11 views
1

EntityFrameworkを使用してDBエンティティのネストされたリストを埋めるために、ただ1つのLINQクエリを使用したいと考えています。EF6ネストされたリストの単一LINQクエリ

私は3つのテーブルエンティティを持っています。 ファーストクラスCitiesは、List<Houses>Housesとを含み、List<Residents>を含む。

これらのクラス:

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() 

残念ながら、私はエラーThe entity or complex type Houses cannot be constructed in a LINQ to Entitiesを取得しています:

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;} 
} 

私が達成したい何がそのようなものです。

Houses = db.Houses.Where(h=>h.CityId ==city.CityId).ToList()の場合のみ機能します。 しかし、それでをHousesに紛失しています。

LINQクエリを1つ使用することもできますか?

+0

あなたは、LINQクエリをDBに書き込もうとしていますか? – Piou

+1

「住民= h.Houses」はタイプミスでなければなりません。また、単一のクラス名を使用することを強くお勧めします。 –

答えて

5

あなたは自分の都市のクエリに家や住民を含める必要があります。

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

エンティティタイプを返すことが大丈夫なら、これは実際には最高です。匿名型への選択が 'Include'の後で、' ToList'の前に行われても機能しません。 **編集**は、エンティティオブジェクトが匿名型から再構築されたことを認識したので、私の発言はちょっと冗長です。 – grek40

+1

@Sergey_Berezovskiy:ありがとうございます。ナビゲーションプロパティを正しく作成することで少し問題がありましたが、それ以降はすばらしいことでした。 – Wiktor

0

あなたはナビゲーションプロパティを使用する必要があり、ない別のdbアクセス

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() 

は、全体の構文をチェックのみ(Residentsと同じ)city.Housesdb.Houses.Where(...)を置き換え、ので、いくつかの他の問題があるかもしれませんしませんでした。

関連する問題