gpt4 book ai didi

c# - LINQ 复杂查询导航属性

转载 作者:太空狗 更新时间:2023-10-29 17:59:41 25 4
gpt4 key购买 nike

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

我有两个表 TeamTeamMember,它们之间有 1-N 关系。我正在使用 Entity Framework ,每个表都有一个实体,每一列都有一个属性。由于这种关系,在团队实体中还有一个 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);
}
}

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

最佳答案

正如我所指出的,我认为这是重复的。但总结一下答案,您只需要将 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();

关于c# - LINQ 复杂查询导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com