LINQ复杂查询导航属性

时间:2011-10-06 15:06:38

标签: c# linq entity-framework

我在使用LINQ

从数据库中获取数据时遇到问题

我有两个表TeamTeamMember,它们与 1-N 关系相关。 我正在使用实体框架,每个表都有一个实体,每个列都有一个属性。同样在Team实体中,由于此关系,还有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);
    }
}

但我认为这根本不是一个好的解决方案。

2 个答案:

答案 0 :(得分: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(); 选择到另一个属性中,所以它们将从数据库中检索并在对象图中构建。

{{1}}

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

这会返回一个匿名对象列表。