2016-06-01 8 views
1
私は私のデータベースのうち、いくつかのデータをつかんで苦労しています

のうちの特定のデータをつかむデータベース

私のデータベース設計は、このようなものです:私はhotelchainidを持ってホテル、hotelidを持っている建物、持って床を持っています建築物、フロアイドがある部屋。私は、データベースから

Databasehandler.cs方法を特定のホテルからすべての部屋をつかむしようとしている

 public static List<Room> GetAllRoomsByHotel(string hotelname) 
     { 
     HotelDbContext context = new HotelDbContext(); 

     var hotel = context.Hotels.Where(h => h.Name == hotelname).Single(); 
     var buildings = context.Buildings.Where(b => b.Hotel.HotelID == hotel.HotelID).ToList(); 
     var floors = context.Floors.Where(f => f.Building.BuildingID == buildings.BuildingID).ToList(); 
     var rooms = context.Rooms.Where(r => r.Floor.FloorID == floors.FloorID).ToList(); 

     return rooms; 
     } 

私はリストに見つかったオブジェクトを追加し、ループを考えていましたそのリストを介してIDを取得し、その後それらを比較するが、私はそれを達成する方法とそれがうまくいくかどうかわからない。

ありがとうございました!

+0

これはまさにナビゲーションプロパティの目的です。 ( 'Hotel.Buildings'など)あなたはそれらを持っていますか?ご不明な点がございましたら、あなたのクラスモデル(の必須部分)を示してください。 –

+0

@GertArnold私はナビゲーションプロパティは持っていませんが、これまでに聞いたことがあります。これらのプロパティを作成すると、このタイプのロジックを簡単に管理できますか?これは私のモデルの様子です。http://pastebin.com/1iHtV8Eu(本質的な部分) – josephzigler

+1

まあ、あなたは子から親へのナビゲーションプロパティを持っています( 'Building.Hotel'など)。親クラスのナビゲーションプロパティ( 'Hotel'などの' public virtual ICollection Buildings {get; set;})もクラスに追加するだけで、親子ナビゲーションプロパティを作成することができます。 EFは命名規則によってすべてを解決できるようです。 –

答えて

1

あなたの場所にあるすべてのナビゲーションプロパティを持ったら、あなたはあなたのhotelnameで指定されたホテルに属している部屋のコレクションを与える

context.Hotels.Where(h => h.Name == hotelname) 
       .SelectMany(h => h.Buildings) 
       .SelectMany(b => b.Floors) 
       .SelectMany(f => f.Rooms) 

で欲しいものを達成することができます。

多くの場合、あなたが見るように、それはそれが必要なら最終結果に親データを含めるように簡単です、のでSelectManyで、クエリ構文は... ...

from h in context.Hotels where h.Name == hotelName 
from b in h.Buildings 
from f in b.Floors 
from r in f.Rooms 
select new 
{ 
    Hotel = h.Name, 
    Building = b.Name, 
    Floor = f.Number, 
    Room = r.Number 
} 

簡単です。

+0

助けてくれてありがとう、それは働いた!ナビゲーションプロパティを使用しているときは、 – josephzigler