4

我有一个简单的查询。

它检查房间列表 -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中出现的错误是: 在此处输入图像描述

谢谢,

标记

4

2 回答 2

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();
于 2013-06-01T18:21:43.993 回答
0

尝试使用空合并运算符:??然后得到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

于 2013-06-01T16:09:16.543 回答