对EF执行查询但从结果中排除特定元素

时间:2012-05-28 10:47:00

标签: entity-framework

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

这是我的模特:

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:“圣玛丽亚之门”

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

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

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

我可以像这样检索所有以“圣诞老人”开头的大门:

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

我的问题是如何在2012/06/01和2012/06/05之间检索以“圣诞老人”开头且可用的所有登机口。所以我们必须检查GateNA ......

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

有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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
);