2012-05-28 57 views
0

假設我必須管理門和這些門的可用性。對EF執行查詢但排除結果中的特定元素

這裏是我的模型:

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:「Santa Fe Gate」

GATEID:3 GateName: 「聖母門」

這些門是不可用在特定的日期(>> GateNA類):

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

GateIDNA:2 GATEID:1個 日期:2012年8月8日

我是AB樂檢索與「聖誕老人」開頭的所有門是這樣的:

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

我的問題是我怎麼能檢索與「聖誕老人」開始2012/06/01和2012/06之間所有的門和可用/ 05。因此,我們必須在GateNA檢查...

結果應該是這裏唯一的一個元素:GATEID 3

任何想法?

謝謝。

回答

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 
); 
+0

謝謝你是對的。這是一個好方法。 – Bronzato

+0

好吧,這是一個EF問題,我認爲這是一個C#問題。而且我不知道這是否會打破EF和模型之間的聯繫,如果這樣做不起作用,您可以自由下注:) –

1

最簡單的辦法是增加導航屬性GateNA收集到您的Gate實體,並在查詢中使用它:

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

如果您不添加p roperty你將不得不在LINQ查詢中手動加入。