【问题标题】:How do I select all objects from a list that have no related objects in another list/model如何从列表中选择在另一个列表/模型中没有相关对象的所有对象
【发布时间】:2018-05-11 02:28:59
【问题描述】:

使用 linq,我如何从 Room 对象列表中选择所有 Room 对象,在 Booking 模型中不存在 Booking 对象(可以通过外键检查)?

这是对象列表:

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 实体数据模型向导数据库中的代码优先生成了模型。只要我明白原因,我也不介意对数据库或模型进行任何小的更改。

【问题讨论】:

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


    【解决方案1】:

    这应该可行:

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

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

    【讨论】:

    • 这可以解决问题。不完全是我想要的,但它确实为我的问题提供了解决方案(列出所有从未被预订过的房间)。
    • 附带说明,在我们包含所有具有非空集合的Room 对象的反向实现的情况下,即db.Rooms.Where(r =&gt; r.Bookings.Any()).ToList();,是否也很容易实现以下内容排序为:Bookings.BookingStatus.Equals("Cancelled")?
    • @salmanxk 如果我的最后一条评论正确,您应该可以将BookingStatus 勾选添加到Any(),如下所示:r =&gt; r.FK_HotelID == id &amp;&amp; !r.Bookings.Any(b =&gt; b.BookingStatus.Equals("Cancelled")) 这将为您提供至少有一个的所有房间取消预订。
    • 正是我需要的!虽然,您需要删除!。谢谢你让我摆脱了一天的偏头痛!
    【解决方案2】:

    这样试试;

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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      相关资源
      最近更新 更多