EF Plus 包含筛选器不会重置



我的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 );

TKeyLeague,并且TElementTeam(以下为说明目的,IGrouping<League, Team>结果应该足以满足您的使用(:

results.Select( g => new
{
League = g.Key,
Teams = g,
} );

综上所述,如果您对跟踪实体不感兴趣,则每次调用使用不同的DbContext实例应该不会显着损害性能。

最新更新