Linq to Sql。除非在C#中为null,否则无效

时间:2013-06-01 15:56:36

标签: c# linq linq-to-sql

我有一个简单的查询。

它会检查房间列表 - 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中出现的错误是: enter image description here

谢谢,

标记

2 个答案:

答案 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>.EmptyEnumerable<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