【发布时间】:2013-06-02 02:24:46
【问题描述】:
我有一个简单的查询。
它检查房间列表 - prebookedRooms
然后它检查另一个房间列表,但使用.Except 运算符从后续列表中删除任何prebookedRooms:
// Get list of rooms already booked
var prebookedRooms = dbt.Rooms
.Where(room => room.Rentals.Any(rental =>
(dteFrom >= rental.check_in && dteFrom < rental.check_out)));
// Get list of rooms
var rooms = dbt.Rooms.Where(r => r.h_id == AccID)
.Except(prebookedRooms)
.GroupBy(p => p.RoomTypes).Select(g => new RatesViewModel
{
TypeName = g.Key.t_name,
TypeID = g.Key.t_id,
TypeCount = g.Count()
})
.ToList();
这很好用 - rooms 返回房间列表,prebookedRooms 除外。
但是,如果 prebookedRooms 没有返回任何记录(即空的“枚举未产生结果”) - 则在执行第二个查询时出现错误(var rooms = ...):
The cast to value type 'Int64' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.
是否在第二个查询中检查 prebookedRooms 是否为空,这样我可以避免此错误?
prebookedRooms 模型:
public class Room
{
[Key]
public long room_id { get; set; }
public long hotel_id { get; set; }
public long type_id { get; set; }
}
在 VS 中出现的错误是:
谢谢,
标记
【问题讨论】:
-
在尝试
.GroupBy之前,您是否有任何理由无法拆分查询并测试dbt.Rooms.Where(r => r.h_id == AccID).Except(prebookedRooms)的结果是否不为空? -
嗨 - 房间总是会返回记录 - 只有当 prebookedRooms 没有记录时,房间查询才会失败。谢谢,马克
-
这就是我的观点 - 通过在
Except处拆分查询,您可以在执行GroupBy之前检查它是否为空。 -
我如何拆分查询?我不知道该怎么做,然后继续使用 GroupBy。
标签: c# linq linq-to-sql