我正在C#课做最后一个项目,我必须建立一个酒店管理系统,但我目前仍在检查两个日期之间是否已预订房间。我试图自己搞清楚,但我不知道如何将此查询字符串转换为LINQ。
任何帮助?
query = "SELECT * FROM Suites WHERE SuiteType = " + suitetype + " AND NumberOfAdultsAllowed >= " + adults + " AND NumberOfChildrenAllowed >= " + children + " AND ";
query += "Suites.SuiteNumber NOT IN (SELECT SuiteNumber FROM Bookings WHERE ";
query += "(StartDate BETWEEN @_start AND @_end) OR ";
query += "(EndDate BETWEEN @_start AND @_end) OR ";
query += "(@_start BETWEEN StartDate and EndDate) OR ";
query += "(@_end BETWEEN StartDate and EndDate) OR ";
query += "(@_start <= StartDate and @_end >= EndDate) OR ";
query += "(@_start >= @_end))";
我想到了第一个通过
获得所有房间var querySearch = from q in db.Suites
where q.SuiteType == suitetype
select q;
然后根据另一个查询检查它,检查套件号是否在表Bookings
中,以及是否在指定的日期之间。
但我每次都迷路了。
答案 0 :(得分:1)
这是非常基本的。唯一的皱纹是子选择,你可以做如下。
您的某些预订逻辑有点多余,在开始和结束之间的日期不可能在开始/结束日期之间也没有开头或结尾。所以你可以减少一点。
此外,最后一个或条件使几乎所有先前的逻辑无效,因为它包括在开始之后结束的任何日期。
注意:这是未经测试的,但应该有效。
var bookings = from b in db.Bookings
where (b.StartDate >= start && b.StartDate <= end)
|| (b.EndDate >= start && b.EndDate <= end) select b.SuiteNumber;
var querySearch = from q in db.Suites
where q.SuiteType == suitetype
&& q.NumberOfAdultsAllowed >= adults
&& q.NumberOfChildrenAllowed >= children
&& !bookings.Contains(q.SuiteNumber)
select q;