【问题标题】:How to convert nested sql statement to linq to entities?如何将嵌套的 sql 语句转换为 linq 到实体?
【发布时间】:2015-06-01 19:23:49
【问题描述】:

我正在尝试创建一个基本的房间可用性声明以与 linq to entity 框架一起使用。我有两个表:“房间”包括列 RoomID/RoomSize 和“预订”,包括 BookingID/RoomID/StartDate/Enddate。

我有一个有效的 sql 语句:

SELECT RoomID, RoomSize from Room
where RoomID NOT IN (SELECT RoomID from booking
             where ('08/01/2015' >= [start] AND '08/01/2015' <= [end]) OR ('08/20/2015' >= [start] AND '08/20/2015' <= [end]))

我已经用 linq to entity 语句做到了这一点:

var rooms = (from r in db.Rooms  
             where !(((from b in db.Bookings
                       where (startDate >= b.StartDate && endDate <= b.EndDate) || (endDate >= b.StartDate && endDate <= b.EndDate)).Contains(r.RoomID))     
                       select new AvailableRoom
                       {
                           ID = r.RoomID,
                           Size = r.RoomSize
                       });

我在 .Contains(r.RoomID) 之前的最后一个括号中收到一个错误,说我应该有一个 select 语句,但我似乎无法让它工作。

欢迎提出任何建议。

如果您认为使用 lambda 会更好/更容易,请随时提出建议和示例。我只是自己对它们不太熟悉.. 还没有。

谢谢。

【问题讨论】:

    标签: c# linq entity-framework nested


    【解决方案1】:

    您可以将 LINQ !...Any() 用于 SQL NOT IN(),如下所示:

    var rooms = (from r in db.Rooms  
                 where !db.Bookings
                          .Where(b => (startDate >= b.StartDate && endDate <= b.EndDate) 
                                        || 
                                      (endDate >= b.StartDate && endDate <= b.EndDate)
                                )
                          .Any(b => b.RoomID == r.RoomID)
                 select new AvailableRoom
                 {
                   ID = r.RoomID,
                   Size = r.RoomSize
                 });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2021-12-17
      • 1970-01-01
      • 2023-03-27
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多