我在使用LINQ
从数据库中获取数据时遇到问题我有两个表Team
和TeamMember
,它们与 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);
}
}
但我认为这根本不是一个好的解决方案。
答案 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();
这会返回一个匿名对象列表。