То, что я делаю здесь сейчас, это, вероятно, худший способ выполнения моих требований, но я не нашел другого пути.
вот мой пример структуры базы данных;

Вот скрипт, который я использую для получения определенных значений;
SELECT DISTINCT h.HotelID, h.HotelName, r.RoomCode, r.RoomName, r.RoomID
FROM RoomsInHotel rh
INNER JOIN Hotels h ON rh.HotelID = h.HotelID
INNER JOIN Rooms r ON rh.RoomID = r.RoomID
order by h.HotelName, r.RoomCode;
Вот результат, который приведенный выше скрипт возвращает мне;

пока все хорошо.
Мне нужно перейти на C # код отсюда. Я хотел бы добиться следующего результата:

Вот где я волнуюсь. Я использую Linq для достижения этой цели, и приведенный ниже код является кодом, который я использовал для приведенного выше результата консоли.
public class Hotel {
public int HotelID {get; set; }
public string HotelName {get; set; }
public IQueryable<Room> Rooms {get; set; }
}
public class HotelWithOneRoom {
public int HotelID { get; set; }
public string HotelName { get; set; }
public Room Room { get; set; }
}
public class Room {
public int RoomID {get; set; }
public string RoomCode {get; set; }
public string RoomName { get; set; }
}
class Program {
static void Main(string[] args) {
#region _assets
IList<HotelWithOneRoom> tempHotelWithOneRoom = new List<HotelWithOneRoom>();
IList<Hotel> tempDistinctHotels = new List<Hotel>();
IList<Room> tempRooms = new List<Room>();
#endregion
#region _connectionString
var connectionString = "Data Source=TOSHIBA-PC\\SQLEXPRESS;Initial Catalog=tbAccomm;Integrated Security=True";
#endregion
using (SqlConnection conn = new SqlConnection(connectionString)) {
using(SqlCommand cmd = conn.CreateCommand()) {
#region _connect to db, generate script and retrieve values
cmd.CommandText = "SELECT DISTINCT h.HotelID, h.HotelName, r.RoomCode, r.RoomName, r.RoomID FROM RoomsInHotel rh INNER JOIN Hotels h ON rh.HotelID = h.HotelID INNER JOIN Rooms r ON rh.RoomID = r.RoomID order by h.HotelName, r.RoomCode;";
cmd.CommandType = System.Data.CommandType.Text;
conn.Open();
SqlDataReader r = cmd.ExecuteReader();
#endregion
#region _assigning the values to tempHotelWithOneRoom
while (r.Read()) {
tempHotelWithOneRoom.Add(new HotelWithOneRoom {
HotelID = int.Parse(r["HotelID"].ToString()),
HotelName = r["HotelName"].ToString(),
Room = new Room {
RoomID = int.Parse(r["RoomID"].ToString()),
RoomCode = r["RoomCode"].ToString(),
RoomName = r["RoomName"].ToString()
}
});
}
#endregion
foreach (var item in tempHotelWithOneRoom) {
if (tempDistinctHotels.Where(x => x.HotelID == item.HotelID).Count() < 1) {
tempDistinctHotels.Add(new Hotel {
HotelID = item.HotelID,
HotelName = item.HotelName
});
var _tempHotel = tempDistinctHotels.Single(x => x.HotelID == item.HotelID);
var _tempRoomList = new List<Room>();
if (_tempHotel.Rooms != null) {
foreach (var _item in _tempHotel.Rooms) {
_tempRoomList.Add(_item);
}
}
_tempRoomList.Add( new Room {
RoomCode = item.Room.RoomCode,
RoomID = item.Room.RoomID,
RoomName = item.Room.RoomName
});
_tempHotel.Rooms = _tempRoomList.AsQueryable();
} else {
var _tempHotel = tempDistinctHotels.Single(x => x.HotelID == item.HotelID);
var _tempRoomList = new List<Room>();
if (_tempHotel.Rooms != null) {
foreach (var _item in _tempHotel.Rooms) {
_tempRoomList.Add(_item);
}
}
_tempRoomList.Add( new Room {
RoomCode = item.Room.RoomCode,
RoomID = item.Room.RoomID,
RoomName = item.Room.RoomName
});
_tempHotel.Rooms = _tempRoomList.AsQueryable();
}
}
#region _output the result
foreach (var item in tempDistinctHotels) {
Console.WriteLine(
"Hotel Name : " + item.HotelName + ", " + "Room Count : " + item.Rooms.Count()
);
foreach (var item2 in item.Rooms) {
Console.WriteLine("--" + item2.RoomCode + ", " + item2.RoomName);
}
}
#endregion
r.Close();
Console.Read();
}
}
}
}
IMO, если бы был конкурс на худший код c #, я бы выиграл этот конкурс с этим кодом. (не так ли?)
Итак, как лучше всего делать то, что я делаю?