【问题标题】:Joining Three DbSets into one new DbSet将三个 DbSet 加入一个新的 DbSet
【发布时间】:2017-07-19 14:28:16
【问题描述】:

我正在尝试获取 3 个 DbSet 并取出其中的一些值并返回一个新的 DbSet。我可以安排一个单人房间,但我无法安排一组房间。

这里有一个单人间,很好用。

这是我的存储库调用。

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

这是我卡住的地方,我想使用 Linq 根据从其他 dbset 传入的值创建房间列表

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

        var rooms = new List<Room>()
        {

        }

        return rooms;
    }

谢谢

【问题讨论】:

    标签: c# asp.net linq model-view-controller asp.net-web-api


    【解决方案1】:

    如果你的类是这样配置的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多