2011-10-06 120 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(); 

这将返回匿名对象的列表。