LINQ复杂查询导航属性

9

我这里有一个从我的数据库用LINQ获取数据的问题。

我有两个表TeamTeamMember,它们通过 1-N 的关系相关联。 我正在使用Entity Framework,每个表都有一个实体,每个列都有一个属性。还有在Team实体中有一个导航属性TeamMember,作为这个关系的结果。

我想做一个查询,可以得到所有我的Team及其成员。

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

这很好。我得到了一个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();

有什么想法吗?

我通过在查询后对成员进行收集的筛选来“解决”它,就像这样:

//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);
    }
}

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

可能是 linq to entities 中的条件包含 的重复问题。 - Kirk Broadhurst
+1 这是一个很好的问题,也是使用EF时最不明显的事情之一,但这是一个重复的问题。我认为还有其他几个重复的问题。 - Kirk Broadhurst
另一个副本:https://dev59.com/N0rSa4cB1Zd3GeqPUCcA - Kirk Broadhurst
2个回答

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();

嘿,我已经尝试过了,但它不起作用!这可能是因为我已经停用了惰性加载吗? - Asier Barrenetxea
@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();

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接