使用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年的所有团队。似乎过滤器停留在我当前的上下文中。有没有一种方法可以禁用该过滤器,以使我只包括特定年份的团队?
答案 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 );
TKey
是League
,而TElement
是Team
(以下出于说明目的,IGrouping<League, Team>
结果应足以供您使用):< / p>
results.Select( g => new
{
League = g.Key,
Teams = g,
} );
所有这些,如果您对跟踪实体不感兴趣,则每次调用使用不同的DbContext
实例不会显着影响性能。