EF Core фильтрует дочерние объекты после включения - PullRequest
0 голосов
/ 02 октября 2019

Я работаю с EF Core и создал общий репозиторий. У меня есть метод, который возвращает все сущности с их дочерними сущностями. Вот мой метод:

public Repository(DevbAERPContext dbContext)
    {
        _dbContext = dbContext;
        Table = _dbContext.Set<T>();
    }

public async Task<IEnumerable<T>> GetAllWithInclude(Expression<Func<T, bool>> where, string[] includeProperties)
    {
        var result = includeProperties.Aggregate(Table.Where(where), (query, path) => query.Include(path)).AsNoTracking();
        return await result.ToListAsync();
    }

При использовании этого метода я не хочу получать мягко удаленные данные. Я могу отфильтровать родительскую сущность, написав выражение where, но я также хочу сделать то же самое для дочерних сущностей. В настоящее время я могу решить эту проблему в контроллере следующим образом:

var roles = await _roleRepository.GetAllWithInclude(x => !x.IsDeleted, new string[] { "RoleTemplateSkills", "RoleTemplateSkills.Skill" }).ConfigureAwait(false);
        var mappedRoles = _mapper.Map<List<RoleTemplateViewModel>>(roles);
        foreach(var mappedRole in mappedRoles)
        {
            mappedRole.RoleTemplateSkills = mappedRole.RoleTemplateSkills.Where(x => !x.IsDeleted).ToList();
        }

Я хочу сделать эту фильтрацию в моем общем методе репозитория. Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы пытались добавить фильтр к самой сущности в конструкторе сущностей? так что вы можете пропустить добавление условия здесь.

Спасибо

Adding condition to the entity

0 голосов
/ 02 октября 2019

Я не уверен, понял ли я вашу проблему точно. Но здесь ниже приведен пример кода, который я использовал в одном универсальном репозитории.

public TEntity FindByInclude(Expression<Func<TEntity, bool>> predicate, params Expression<Func<TEntity, object>>[] includeProperties)
        {
            IQueryable<TEntity> result = dbSet.Where(predicate);


            if (includeProperties.Any())
            {
                foreach (var includeProperty in includeProperties)
                {
                    result = result.Include(includeProperty);
                }
            }

            var firstResult = result.FirstOrDefault(predicate);

            if (firstResult != null)
                dbSet.Attach(firstResult);

            return firstResult;
        }

        public IEnumerable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties)
        {
            IQueryable<TEntity> result = dbSet.AsNoTracking();

            return includeProperties.Aggregate(result, (current, includeProperty) => current.Include(includeProperty));
        }

Однако в конструкторе я не использовал Table. Вместо этого я использовал следующее:

public class FitnessRepository<TEntity> : IFitnessRepository<TEntity> where TEntity :class {
    private readonly FitnessDbContextt fitnessDbContext;

    private readonly DbSet<TEntity> dbSet;

    public FitnessRepository (FitnessDbContextt context) {
        fitnessDbContext = context;
        dbSet = context.Set<TEntity> ();

    }
}

Надеюсь, это поможет.

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