public async Task <IEnumerable <BaseConhecimento> > GetWithBaseChildsAsync(string[] searchArr, decimal idUser, int?pageNumber, int pageSize) { List <Resumo> resumos = new List <Resumo>(); List <BuscaChave> tags = new List <BuscaChave>(); var lsVersion = new List <BaseConhecimento>(); IEnumerable <BaseConhecimento> data = null; Expression <Func <BaseConhecimento, bool> > WhereVisibilidadeBase = null; int totalFound = 0; int total = 0; // Monta filtro de Tipo de Visualização da Base de Conhecimento if (idUser == 0) { WhereVisibilidadeBase = b => b.TpVisualizacao == EnumHelper.Visibilidade.PUBLICO.ToString(); } else { WhereVisibilidadeBase = b => ( b.TpVisualizacao != EnumHelper.Visibilidade.PRIVADO.ToString() || (b.TpVisualizacao == EnumHelper.Visibilidade.PRIVADO.ToString() && b.IdUsuarioRegistro == idUser) ); } if (searchArr.Length > 0) { data = await _db .Include(c => c.CausaRaiz) .Include(r => r.Resumo) .Include(s => s.SolucaoPaliativa) .Include(s => s.BuscaChave) .ThenInclude(e => e.PalavraChave) .Include(p => p.BaseProduto) .ThenInclude(e => e.Produto) // Filtra a Base de Conhecimento de acordo com a(s) palavra(s) chave informada(s) .Where(d => d.BuscaChave .Where(a => searchArr.Contains(a.PalavraChave.Palavra.RemoveAccents().ToLower())).Any()) // Filtra a Base de Conhecimento de acordo com a Visibilidade .Where(WhereVisibilidadeBase) // Filtra Paginação na Base de Dados .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize) .ToListAsync(); total = await _db .Where(d => d.BuscaChave .Where(a => searchArr.Contains(a.PalavraChave.Palavra.RemoveAccents().ToLower())).Any()) .Where(WhereVisibilidadeBase).CountAsync(); // Se não encontra, procura no Titulo, Resumo, etc if (data.Count() == 0) { var WhereResumo = PredicateHelper.False <Resumo>(); foreach (var item in searchArr) { WhereResumo = WhereResumo.Or(p => p.DsTituloPuro.ToLower().Contains(item)); WhereResumo = WhereResumo.Or(p => p.TextoPuro.Contains(item)); } data = await _db .Include(c => c.CausaRaiz) .Include(r => r.Resumo) .Include(s => s.SolucaoPaliativa) .Include(s => s.BuscaChave) .ThenInclude(e => e.PalavraChave) .Include(p => p.BaseProduto) .ThenInclude(e => e.Produto) // Filtra o Titulo e o Resumo de acordo com a(s) palavra(s) chave informada(s) .Where(r => r.Resumo.AsQueryable() .Where(WhereResumo).Any()) // Filtra a Base de Conhecimento de acordo com a Visibilidade .Where(WhereVisibilidadeBase) // Filtra Paginação na Base de Dados .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize) .ToListAsync(); total = await _db .Where(r => r.Resumo.AsQueryable() .Where(WhereResumo).Any()) .Where(WhereVisibilidadeBase).CountAsync(); } } else { data = await _db .Include(c => c.CausaRaiz) .Include(r => r.Resumo) .Include(s => s.SolucaoPaliativa) .Include(s => s.BuscaChave) .ThenInclude(e => e.PalavraChave) .Include(p => p.BaseProduto) .ThenInclude(e => e.Produto) // Filtra a Base de Conhecimento de acordo com a Visibilidade .Where(WhereVisibilidadeBase) // Filtra Paginação na Base de Dados .Skip(((pageNumber ?? 1) - 1) * pageSize).Take(pageSize) .ToListAsync(); total = await _db.Where(WhereVisibilidadeBase).CountAsync(); } // Adiciona Destaque(Cor Amarela) nas palavras encontradas na busca foreach (var item in data) { AddHighLightWord ( item.Resumo.Where(d => d.SeqVersao == item.Resumo.Select(y => y.SeqVersao).Max()), item.BuscaChave, searchArr, resumos, tags, out totalFound, searchArr.Length > 0 ); lsVersion.Add( new BaseConhecimento { Id = item.Id, DtHrRegistro = item.DtHrRegistro, IdUsuarioRegistro = item.IdUsuarioRegistro, TpVisualizacao = item.TpVisualizacao, StBase = item.StBase, Usuario = item.Usuario, TipoVisualizacao = item.TipoVisualizacao, SituacaoBase = item.SituacaoBase, BuscaChave = tags.Where(c => c.Id == item.Id).ToList(), TotalMath = total, //totalFound, // Filtra a CausaRaiz de maior Versão CausaRaiz = item.CausaRaiz .Where(d => d.SeqVersao == item.CausaRaiz.Select(y => y.SeqVersao).Max()).ToList(), // Filtra o Resumo de maior Versão Resumo = resumos.Where(r => r.Id == item.Id).ToList(), // Filtra a Solução Paliativa de maior Versão SolucaoPaliativa = item.SolucaoPaliativa .Where(d => d.SeqVersao == item.SolucaoPaliativa.Select(y => y.SeqVersao).Max()).ToList(), BaseProduto = item.BaseProduto } ); } lsVersion.OrderByDescending(b => b.DtHrRegistro); return(lsVersion); }