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
减少为一个局部序列。
大家好!我正在尝试执行一个相当简单的 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
减少为一个局部序列。