LINQ复杂查询导航属性

Asi*_*xea 9 c# linq entity-framework

我在使用LINQ从数据库中获取数据时遇到问题

我有两个表TeamTeamMember,它们通过相关的1-N的关系.我正在使用实体框架,每个表都有一个实体,每个列都有一个属性.同样在Team实体中TeamMember,由于此关系,存在导航属性.

我想进行查询,我可以将他的所有团队与团队成员联系起来.

result = (from t in this.context.Teams
          orderby t.Name
          select t)
         .Include("TeamMembers")
Run Code Online (Sandbox Code Playgroud)

这很好.我得到了一个Team Entities集合,其中的Team.TeamMember属性填充了每个团队成员的数据.

问题是当我想要执行更复杂的查询时,例如过滤TeamMembers的查询.

例如,两个表都有一列EndDateTime.如果我想让所有未结束的团队和团队成员(他们的结束日期时间不为空)我不知道该怎么做.

通过此查询,我将仅过滤团队,但不过滤团队成员.

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

任何的想法?

我有点"解决"它在查询后对成员进行过滤,到集合.像这样:

//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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*rst 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();
Run Code Online (Sandbox Code Playgroud)