如何将此查询字符串转换为LINQ to SQL查询?

时间:2016-05-20 16:07:54

标签: c# sql linq oop

我正在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中,以及是否在指定的日期之间。

但我每次都迷路了。

1 个答案:

答案 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;