LINQ 不支持使用本地 collections 的查询

Queries with local collections are not supported LINQ

大家好!我正在尝试执行一个相当简单的 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;

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

所以可以这样做...

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

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

但是...

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

...抛出异常。

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