LINQ

时间:2016-03-02 23:41:18

标签: linq linq-to-sql

大家好!我正在尝试做一个相当简单的LINQ查询来查找酒店的可用房间。 (也就是说,从一个房间的泳池找到一个可用的房间,并检查房间里没有待处理的清洁等)。

但是当我尝试执行第三个查询时,我得到了标题中看到的异常。我执行它时实际上并没有得到异常,但是当我尝试使用“unfinishedTasksInPool”变量时。

我尝试将“unfinishedTasksInPool”转换为列表,看看是否有帮助,但每当我尝试使用“unfinishedTasksInPool”时,我都会得到例外。

编辑:每当我在第三个查询的where子句中排除“availableRoomsFromPool.Contains(tasks.roomId”)时,一切似乎都能正常工作。但这并不能完全解决问题。

var pendingReservation = database.Reservations.Where(res => res.reservationID == resId).First();

var reservationsInSameGroup = from otherReservations in database.GetTable<Reservation>()
                              where (otherReservations.beds == pendingReservation.beds
                                    && otherReservations.rank == pendingReservation.rank
                                    && otherReservations.roomID != null)
                              select otherReservations.roomID;


var availableRoomsFromPool = from rooms in database.GetTable<Room>()
                     where (!reservationsInSameGroup.Contains(rooms.roomId)
                     && rooms.beds == pendingReservation.beds
                                    && rooms.roomRank == pendingReservation.rank)
                     select rooms.roomId;

var unfinishedTasksInPool = from tasks in database.GetTable<HotelTask>()
                         where (availableRoomsFromPool.Contains(tasks.roomId) 
                         && tasks.taskStatus < 2)
                         select tasks.roomId;

1 个答案:

答案 0 :(得分:2)

这是LINQ-to-SQL限制。您可以在查询中使用本地序列(只要在Contains中使用它们),但不能使用本地序列,本地序列本身是使用其他本地序列的查询结果。

所以这样做可以......

var availableRoomsFromPool = (from ....).ToArray();

...因为查询包含一个本地序列(reservationsInSameGroup)。

但是...

var unfinishedTasksInPool = (from ...).ToArray();

...抛出异常。

解决方案是在第三个查询中使用var availableRoomsFromPool = (from ....).ToArray();的结果,因为这会将availableRoomsFromPool缩减为一个本地序列。