根据子表筛选器从父表中选择记录

时间:2012-06-29 15:50:27

标签: asp.net asp.net-mvc asp.net-mvc-3

这应该很简单,但我很困惑。

我有一个父/子表 - 我想要做的就是从父表中选择,具体取决于对子表的过滤。

所以父表是一对多地链接到客户表 - 我希望选择客房,其中客户表中没有链接记录,其中客户。出发日期在特定日期之前:< / p>

  public class Room
    {
        public int RoomId { get; set; }
        public string RoomName { get; set; }
        public List<Client> Clients { get; set; }
    }

  public class Client
    {
        public int ClientId { get; set; }
        public int RoomId { get; set; }
        public string Name { get; set; }
        public DateTime Arrival { get; set; }
        public DateTime Departure { get; set; }
        public Room Room { get; set; }
    }

在我的控制器中,我一直在尝试:

 public ActionResult Avail()
        {
            DateTime dteFrom = DateTime.Parse("2012-07-01");  //hard coded for testing
            Room room = db.Rooms.Where(r => r.Clients.Any(c => c.Departure <= dteFrom));

但我收到错误消息:

Cannot implicitly convert type 'System.Linq.IQueryable<ttp.Models.Room>' to 'ttp.Models.Room'. An explicit conversion exists (are you missing a cast?)

有人建议我是否需要更改我的模型类或我的Where语句?

1 个答案:

答案 0 :(得分:1)

Room room表示单个会议室,而db.Rooms.Where(r => r.Clients.Any(c => c.Departure <= dteFrom))表示会议室列表。

如果您希望查询只返回一个结果,则可以执行以下操作:

Room room = db.Rooms.SingleOrDefault(r => r.Clients.Any(c => c.Departure <= dteFrom));

或者,如果您想要返回与查询匹配的所有房间,您可以执行以下操作:

IQueryable<Room> rooms = db.Rooms.Where(r => r.Clients.Any(c => c.Departure <= dteFrom));