2011-10-06 129 views
9

我在這裏與LINQLINQ複雜的查詢導航屬性

從我的數據庫獲取數據有一個問題,我有兩個表TeamTeamMember,這是由1-N關係有關。 我正在使用實體框架,併爲每個表有一個屬性爲每列的一個實體。此外,在團隊實體中,作爲此關係的結果,導航屬性爲TeamMember

我想要做一個查詢,在那裏我可以通過他們的團隊成員獲得我所有的團隊。

result = (from t in this.context.Teams 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 

工作正常。我收到了一組團隊實體,其中Team.TeamMember屬性填充了每個團隊成員的數據。

問題是,當我想要執行一個更復雜的查詢,如過濾TeamMembers的查詢。

例如,兩個表都有一列EndDateTime。如果我想讓所有未結束的團隊和團隊成員(他們的結束日期時間不爲空),我不知道該怎麼做。

使用此查詢我將過濾只是團隊,但不是團隊成員。

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select t) 
     .Include("TeamMembers") 
     .ToList(); 

有什麼想法嗎?

我有點「解決」它做了查詢後的成員過濾器,以收集。像這樣:

//Filter out the End dated care coordiantors 
var careCoordinatorsToDelete = new List<CareCoordinator>(); 
foreach (var team in result) 
{ 
    careCoordinatorsToDelete.Clear(); 

    foreach (var careCoordinator in team.CareCoordinators) 
    { 
     if (careCoordinator.EndDateTime != null) 
      careCoordinatorsToDelete.Add(careCoordinator); 
    } 

    foreach (var toDelete in careCoordinatorsToDelete) 
    { 
     team.CareCoordinators.Remove(toDelete); 
    } 
} 

但我不認爲這是一個很好的解決方案。

+0

[條件包括在LINQ到實體?]的可能重複(http://stackoverflow.com/questions/1085462/conditional-include-in-linq-to-entities) –

+0

+1這是一個很好的問題和一個與EF最不明顯的事情,但它是重複的。我認爲還有其他一些重複。 –

+0

另一個重複:http://stackoverflow.com/questions/1680863/linq-include-with-where-clause –

回答

1

正如我指出的,我認爲這是重複的。但總結答案,只需將子句Where作爲Select語句的一部分(通過將其用作匿名類型的一部分),枚舉查詢,然後檢索所需的對象。

因爲您已將TeamMembers選擇爲其他屬性,所以它們將從數據庫中檢索並在對象圖中構造。

result = (from t in this.context.Teams 
      where t.EndDateTime == null 
      orderby t.Name 
      select new 
      { 
       Team = t, 
       Members = t.TeamMembers.Where(tm => tm.EndDateTime == null) 
      }) 
     .ToList() 
     .Select(anon => anon.Team) 
     .ToList(); 
+0

嘿。我試過了,但它不起作用!難道是因爲我的懶惰加載已停用? –

+0

@Asier - .ToList()強制查詢執行 - 因此該示例是急切加載,而不是延遲加載... – barrypicker

0

這應該工作:

var result = this.context.Teams.Where(t=>t.EndDateTime==null).Select(t=> 
new { Name = t.Name, 
      PropertyX = t.PropertyX... //pull any other needed team properties. 
      CareCoordinators = t.CareCoordinators.Where(c=>c.EndDateTime==null) 
}).ToList(); 

這將返回匿名對象的列表。