2017-02-28 10 views
1

私は3つのDbSetsを取得しようとしていて、その中のいくつかの値を取り出して新しいDbSetを返します。私は1つの部屋に人口を得ることができますが、私は部屋のグループを得るのに問題があります。1つの新しいDbSetに3つのDbSetsを結合

ここでは部屋が1つしかありませんが、これは問題なく動作します。

ここは私のリポジトリコールです。ここで

public Room GetRoom(Guid id) 
    { 
     var room = _db1Context.ClientRoom.FirstOrDefault(x =>x.Id == id); 
     var roomDetails = _db2Context.RoomDetail.FirstOrDefault(x => x.ClientRoomId== id); 
     var summary = _db3Context.RoomSummary.FirstOrDefault(x => x.ClientRoomId == id); 

     var room = _roomFactory.BuildRoomEntity(room, roomDetails, summary); 
     return room; 
    } 

私はここの部屋 の一覧を取得する以外は同様に何かをしたいと思い、私の工場コール

public Room BuildRoomEntity(ClientRoom room, RoomDetail roomDetail, RoomSummary summary) 
    { 
     var room = new Room() 
     { 
      Id = room.ClientRoomId,              
      Name = room.DisplayName,       
      Description = roomDetail.Description, 
      Status = summary.Status, 
      OnlineStatus = summary.OnlineStatus, 
      ServicePlan = roomdetail.ServicePlan 
      Incidents = room.Incident == null ? new List<Incident>() : room.Incident.ToList(), 
      Devices = roomDetail.Devices == null ? new List<Device>() : roomDetail.Devices.ToList() 
     }; 

     return room; 
    } 

は私のレポコールがどのように見えるかです。

public List<Room> GetRooms() 
    { 
     var room = _db1Context.room; 
     var roomDetails = _db2Context.RoomDetails; 
     var roomSummary = _db3Context.RoomSummaries; 

     var room = _roomFactory.BuildRoomEntity(room, roomDetails, summary); 
     return room; 
    } 

これは私がこだわっているところ、私は他のdbsetsから

public List<Room> BuildRoomEntity(DbSet<ClientRoom> room, DbSet<RoomDetail> roomDetail, DbSet<RoomSummary> summary) 
    { 

     var rooms = new List<Room>() 
     { 

     } 

     return rooms; 
    } 

おかげ

答えて

0

を渡された値に基づいて、部屋のリストを作成するためのLINQを使用したいですあなたはクラスがこのように構成されている場合:次に

public class ClientRoom 
{ 
    public int Id { get; set; } 
    public string DisplayName { get; set; } 
    public RoomDetail RoomDetail { get; set; } 
    public RoomSummary RoomSummary { get; set; } 
} 

、あなたはとDbSet.Includeを使用する必要がありますすることができます。

var room = _db1Context.room 
room.Include(r=>r.RoomDetail); 
room.Include(r=>r.RoomSummary); 

あなたが唯一のサブテーブル内のIDを持っている場合は、あなたが使用することができます参加:

var room = _db1Context.room; 
var roomDetails = _db2Context.RoomDetails; 
var roomSummary = _db3Context.RoomSummaries; 

var subtables = roomDetails.Join(roomSummary, rd=>ClientRoomId, rs=>rs.ClientRoomId, (roomDetails, summary)=>new {roomDetails.ClientRoomId, roomDetails, roomSummary}); 

var rooms = room.Join(subtables, r=>r.Id, sub=>sub.ClientRoomId, (room, sub)=> 
    new Room() 
     { 
      Id = room.Id,              
      Name = room.DisplayName,       
      Description = sub.roomDetail.Description, 
      Status = sub.summary.Status, 
      OnlineStatus = sub.summary.OnlineStatus, 
      ServicePlan = sub.roomdetail.ServicePlan 
      Incidents = room.Incident == null ? new List<Incident>() : room.Incident.ToList(), 
      Devices = sub.roomDetail.Devices == null ? new List<Device>() : roomDetail.Devices.ToList() 
     }); 
関連する問題