1

在 asp.net MVC 应用程序中,我试图找到有客人/客户的房间,客人在某个日期之前离开的房间。

Client 模型类具有外键 RoomId:

public class Room
{
    public int RoomId { get; set; }
    [Display(Name = "Room Name")]
    public string Name { get; set; }
    public bool Disabled { get; set; }
    public List<Client> Clients { get; set; }
}

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

我当前的 Linq 查询是:

from r in Rooms
where r.Disabled == false
//where r.Clients.Departure<=DateTime.Parse("2012-07-01")
select new
  {
    r.Name,
    r.Disabled
  }

注释行: //where r.Clients.Departure..... 在 LinqPad 中出现以下错误:

“System.Data.Linq.EntitySet”不包含“Departure”的定义,并且找不到接受“System.Data.Linq.EntitySet”类型的第一个参数的扩展方法“Departure”(按 F4 添加使用指令或程序集参考)

有什么方法可以在 Linq 中运行此查询,以排除 Departure date where 子句?

谢谢你的帮助,

标记

4

2 回答 2

2

在你发表评论后,这个应该做你需要的

&& r.Clients.All(client => client.Departure<=DateTime.Parse("2012-07-01"))

编辑 :

也许声明 DateTime 来比较查询

var dt = DateTime.Parse("2012-07-01");

&& r.Clients.All(client => client.Departure<=dt)
于 2012-07-05T09:00:50.943 回答
0

如果将Room引用更改Client为 virtual 并将Client引用更改为Roomvirtual 会发生ICollection什么?这应该有助于 EF 建立联系。

请参阅此处: http: //msdn.microsoft.com/en-us/library/gg715120 (v=vs.103).aspx或此处了解 Julia Lerman 关于该主题的内容:http: //msdn.microsoft.com/ zh-CN/数据/hh134698.aspx

这应该使您能够重新添加注释掉的子句并且它应该可以工作。

编辑:实际上注释掉的位应该根据 Raphaël Althaus 的更正而改变。

我认为结合我和 Raphaël 的建议是最好的方法。

像这样

public class Room
{
    public int RoomId { get; set; }
    [Display(Name = "Room Name")]
    public string Name { get; set; }
    public bool Disabled { get; set; }
    public virtual ICollection<Client> Clients { get; set; }
}

public class Client
{
    public int ClientId { get; set; }
    public int RoomId { get; set; }
    public string RoomName { get; set; }
    public DateTime Arrival { get; set; }
    public DateTime Departure { get; set; }
    public virtual Room Room { get; set; }
}
于 2012-07-05T09:00:39.603 回答