EF Plus IncludeFilter不会重置

时间:2018-09-28 20:28:07

标签: c# entity-framework

使用Entity Framework Plus,我的EF存储库具有以下代码:

    public IEnumerable<League> GetLeaguesWithTeamsByYear(int year)
    {
        return Context.Leagues.IncludeFilter(l => l.Teams.Where(t => t.Year == year));
    }

这很好,因为当我选择年份(例如1871年)时,我得到了1871年联赛的所有球队。

但是,当我切换到1872年时,我得到了1871年和1872年的所有团队。似乎过滤器停留在我当前的上下文中。有没有一种方法可以禁用该过滤器,以使我只包括特定年份的团队?

1 个答案:

答案 0 :(得分:1)

我的假设是,您使用的是相同的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>结果应足以供您使用):< / p>

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

所有这些,如果您对跟踪实体不感兴趣,则每次调用使用不同的DbContext实例不会显着影响性能。