我有一个简单的查询。
它会检查房间列表 - 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中出现的错误是:
谢谢,
标记
答案 0 :(得分:1)
你不能只从Except
辞职并写下:
var rooms = dbt.Rooms.Where(r => r.h_id == AccID)
.Where(room => !room.Rentals.Any(rental =>
(dteFrom >= rental.check_in && dteFrom < rental.check_out))).
.GroupBy(p => p.RoomTypes).Select(g => new RatesViewModel
{
TypeName = g.Key.t_name,
TypeID = g.Key.t_id,
TypeCount = g.Count()
})
.ToList();
答案 1 :(得分:0)
尝试使用null coalescing运算符:??
,然后获取IQueryable<T>
等效的Enumerable<T>.Empty
,Enumerable<T>.Empty().AsQueryable()
和DefaultIfEmpty
无效的房间,所以它不会因为它为空而疯狂||空:
var rooms = dbt.Rooms.Where(r => r.h_id == AccID)
.Except(prebookedRooms ?? Enumerable.Empty<T>().AsQueryable().DefualtIfEmpty(new Room() { room_id = -1, hotel_id = -1, type_id = -1}))
.GroupBy(p => p.RoomTypes).Select(g => new RatesViewModel
{
TypeName = g.Key.t_name,
TypeID = g.Key.t_id,
TypeCount = g.Count()
})
.ToList();
我不知道你的类型,所以我不知道在Enumerable.Empty<T>
调用的泛型参数中放什么。自己添加。
另外,请记住using System.Linq
!