EF Plus IncludeFilter не сбрасывается - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующий код для моего репозитория 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. Кажется, что фильтр остается в моем текущем контексте.Есть ли способ отключить этот фильтр, чтобы я включал только команды определенного года?

1 Ответ

0 голосов
/ 29 сентября 2018

Я предполагаю, что вы используете тот же экземпляр 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 экземпляр за вызов не должен существенно снижать производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...