c# - 使用 C# 检索 SQL Server 父/子查询结果

标签 c# sql-server linq t-sql sql-server-2008

我现在在这里所做的可能是满足我的要求的最糟糕的方法,但我还没有找到任何其他方法。

这是我的示例数据库结构;

enter image description here

这是我用来检索某些值的脚本;

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;

这是上面脚本返回的结果;

enter image description here

到这里为止一切都很好。

我需要从这里转移到 C# 代码。我想要实现的是以下结果;

enter image description here

这就是我担心的地方。我使用 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# 代码的竞赛,我将用这段代码赢得竞赛。 (我会吗?)

那么,我所做的事情的最优化方式是什么?

最佳答案

C# 不是我选择的语言,但你可以这样做:

Dictionary<int, Hotel> Hotels = new Dictionary<int, Hotel> ();
while (r.Read()) {
    if (!Hotels.ContainsKey(r["HotelID"])) {
        NewHotel Hotel= new Hotel();
        NewHotel.HotelID = r["HotelID"];
        Newhotel.HotelName = r["HotelName"];
        NewHotel.Rooms = new Dictionary<int, Room> ();
        Hotels.Add(NewHotel);
    }
    Room NewRoom = new Room();
    NewRoom.RoomID = r["RoomName"];
    NewRoom.RoomCode = r["RoomCode"];
    NewRoom.RoomName = r["RoomName"];
    Hotels.Items("HotelID").Rooms.Add(NewRoom);
}

就像 jpmcclung 指出的那样,您需要一些软件工程技能来创建成功的应用程序。您的项目越大,需要的设计和规划就越多。

关于c# - 使用 C# 检索 SQL Server 父/子查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7160147/

相关文章:

c# - 尝试使用 XPath 过滤 XML

c# - 为什么括号使我的正则表达式不匹配?

c# - 如何在 RadGridView 中的单元格值更改时触发事件?

sql - 多个连接列上的多个 STRING_AGG 导致聚合膨胀

sql-server - 如何在 POWER BI 中减去不同行上的日期

sql-server - 两个不同列的 SUM 和 DISTINCT

LINQ 是否可以通过 LINQ 表达式树获取没有返回类型的方法名称?

c# - LINQ to Entities 中的 String.Replace

c# - 如何访问azure webrole中的signalr hub

c# - 无法为属性分配新值