0

假设我必须管理门和这些门的可用性。

这是我的模型:

public class Gate
{
    public int GateID { get; set; }
    public string GateName { get; set; }
}

public class GateNA  ---> NA: NotAvailable
{
    public int GateNAID { get; set; }
    public int GateID { get; set; }
    public DateTime Date { get; set; }
}

现在假设我有以下示例数据:

对于盖茨:

GateID:1 GateName:“圣安东尼奥门”

GateID:2 GateName:“圣达菲门”

GateID:3 GateName:“Santa Maria Gate”

这些门在特定日期不可用(>> GateNA 类):

GateIDNA:1 GateID:2 日期:2012/06/01

GateIDNA:2 GateID:1 日期:2012/08/08

我可以像这样检索所有以“Santa”开头的门:

var gateRepository = unitOfWork.Create<Gate>();
var gates = gateRepository.Find(m => m.GateName.Contains("Santa"));

我的问题是如何检索以“Santa”开头且在 2012/06/01 和 2012/06/05 之间可用的所有大门。所以我们必须检查GateNA...

结果应该只有一个元素:GateID 3。

任何的想法?

谢谢。

4

2 回答 2

1

GateNA最简单的解决方案是将用于集合的导航属性添加到您的Gate实体并在查询中使用它:

gateRepository.Find(m => m.GateName.Contains("Santa") && 
                         !m.GateNAs.Any(g => g.Date == selectedDate));

如果不添加该属性,则必须在 LINQ 查询中执行手动联接。

于 2012-05-28T11:09:32.020 回答
0

你为什么不像这样重组你的班级:

public class Gate
{
    public int GateID { get; set; }
    public string GateName { get; set; }
    public List<GateNA> NotAvailableDates { get; set; }
}

public class GateNA  ---> NA: NotAvailable
{
    public int GateNAID { get; set; }
    public int GateID { get; set; }
    public DateTime Date { get; set; }
}

然后

var gates = gateRepository.Find(
    m => m.GateName.Contains("Santa") && 
   (m.NotAvailableDates.Find(
        d => d.Date==new DateTime(2012,06,01)
   )==null
);
于 2012-05-28T11:05:15.547 回答