大家好!我正在尝试做一个相当简单的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;
答案 0 :(得分:2)
这是LINQ-to-SQL限制。您可以在查询中使用本地序列(只要在Contains
中使用它们),但不能使用本地序列,本地序列本身是使用其他本地序列的查询结果。
所以这样做可以......
var availableRoomsFromPool = (from ....).ToArray();
...因为查询包含一个本地序列(reservationsInSameGroup
)。
但是...
var unfinishedTasksInPool = (from ...).ToArray();
...抛出异常。
解决方案是在第三个查询中使用var availableRoomsFromPool = (from ....).ToArray();
的结果,因为这会将availableRoomsFromPool
缩减为一个本地序列。