我的EF存储库使用以下代码,使用Entity Framework Plus
:
public IEnumerable<League> GetLeaguesWithTeamsByYear(int year)
{
return Context.Leagues.IncludeFilter(l => l.Teams.Where(t => t.Year == year));
}
这很好用,因为当我选择年份(比如 1871 年(时,我会得到 1871 年联赛的所有球队。
但是,当我切换到 1872 年时,我得到了 1871 年和 1872 年的所有球队。过滤器似乎保留在我当前的上下文中。有没有办法禁用该过滤器,以便我只包括特定年份的团队?
我的假设是,您使用相同的DbContext
实例,因此先前调用的跟踪实体将包含在以后调用的League.Teams
收集结果中。 你可以尝试.AsNoTracking()
看看这是否有帮助,但它可能会阻止将 EF Plus 的筛选包含的结果挂接到League.Teams
集合(它只是使用常规 EF 实现(。
就个人而言,我会投影然后撰写我想要的结果,而无需 EF Plus。 例如:
return Context.Leagues.Select( l => new
{
League = l,
Teams = l.Teams.Where( t => t.Year == year ),
}
.ToArray()
.Select( at =>
{
var l = at.League;
l.Teams = at.Teams;
return l;
} );
我不喜欢在这里重用League
类,因为其他用户可能会认为整个Teams
集合都在代码路上的某个地方加载。 也许为这种用法创建一个 DTO。
另一种解决方案是从另一端开始,然后按联赛分组:
return Context.Teams.Where( t => t.Year == year )
.GroupBy( t => t.League );
TKey
League
,并且TElement
Team
(以下为说明目的,IGrouping<League, Team>
结果应该足以满足您的使用(:
results.Select( g => new
{
League = g.Key,
Teams = g,
} );
综上所述,如果您对跟踪实体不感兴趣,则每次调用使用不同的DbContext
实例应该不会显着损害性能。