如何从列表中选择在另一个列表/模型中没有相关对象的所有对象

时间:2017-11-27 18:54:29

标签: c# linq asp.net-mvc-5 entity-framework-6 ado.net-entity-data-model

使用linq,我如何从预订模型中没有预订对象的房间对象列表中选择所有房间对象(可以通过外键检查)?

这是对象列表:

var rooms = (from m in db.Rooms
             where
             m.FK_HotelID == id
             select m).ToList();

这是名为Room的第一个模型:

public partial class Room
{
    public Room()
    {
        Bookings = new HashSet<Booking>();
    }
    public int RoomID { get; set; }
    public int RoomNumber { get; set; }
    public string RoomType { get; set; }
    // Foreign Key
    public int? FK_HotelID { get; set; }
    public virtual ICollection<Booking> Bookings { get; set; }
    // Navigation Property
    public virtual Hotel Hotel { get; set; }
}

另一个名为Booking的模型:

public partial class Booking
{
    public int BookingID { get; set; }
    public string BookingName { get; set; }
    public string BookingContact { get; set; }
    public DateTime BookingTime { get; set; }
    public string BookingStatus { get; set; }
    // Foreign Key
    public int? FK_RoomID { get; set; }
    // Navigation Property
    public virtual Room Room { get; set; }
}

我是linq的初学者,到目前为止我所能理解的是如何从单个模型中进行选择,尽管我可以使用带有左连接的SQL查询轻松获得结果。

P.S:我首先创建数据库并使用 ADO.NET实体数据模型向导数据库中的代码优先生成模型。我也不介意对数据库或模型进行任何小的更改,只要我理解为什么。

2 个答案:

答案 0 :(得分:2)

这应该有效:

var unbookedRooms = db.Rooms.Where(r =>  r.FK_HotelID == id && !r.Bookings.Any()).ToList();

我们的想法是在子集合上使用LINQ的Any()方法来排除具有非空Room集合的Booking个对象。

答案 1 :(得分:1)

试试这个;

var rooms = (from m in db.Rooms
             where
             m.FK_HotelID == id &&
             !m.Bookings.Any()
             select m).ToList();