Check for list records in the entity framework

0

I have the following code:

var ret = Monitoramento.List
            .Include(p => p.CD)
            .ThenInclude(p => p.CargaEntrega)
            .ThenInclude(p => p.CargaEntrega.Motorista)
            .ThenInclude(p => p.CargaEntrega.Veiculo)
            .ThenInclude(p => p.CargaEntrega.Entregas)
            .ThenInclude(p => p.CargaEntrega.Entregas.Select(s => s.Cliente))
            .ThenInclude(p => p.CargaEntrega.Entregas.Select(s => s.NotasFiscais))
            .GetQuery()
            .Where(
                p => !p.IsDeleted
                && (p.Data >= dateInicio && p.Data <= dateFinal)
                && (!String.IsNullOrEmpty(filtro.motoristaId) ? 
                    p.CargaEntrega.Motorista.Id.ToString() == filtro.motoristaId : 1 == 1)
                && (!String.IsNullOrEmpty(filtro.unidadeNegociosId) ? 
                    p.CD.Id.ToString() == filtro.unidadeNegociosId : 1 == 1)
                && (!String.IsNullOrEmpty(filtro.status) ? 
                    statusBuscado.Contains(p.StatusMonitoramento) : 1 == 1)
                && (!String.IsNullOrEmpty(filtro.nroTransporte) ? 
                    "" + p.CargaEntrega.Entregas.FirstOrDefault().NroTransporte == filtro.nroTransporte : 1 == 1)
                && (!String.IsNullOrEmpty(filtro.uf) ? 
                    "" + p.CargaEntrega.Entregas.FirstOrDefault().Cliente.Estado == filtro.uf : 1 == 1)                    
             )
            .Select(MonitoramentoDto.ToDto)
            .ToArray();

        // Garantia de que os monitoramentos obedecem as duas regras:
        // Não exibe entregas que não possuem nota fiscal
        // Não exibe monitoramentos que não possuem entregas
        foreach (MonitoramentoDto itemMonitoramento in ret)
        {
            if(itemMonitoramento.Entregas.Length > 0)
            {
                List<EntregaDto> entregas = new List<EntregaDto>();
                foreach (EntregaDto entrega in itemMonitoramento.Entregas)
                {
                    if(entrega.NotaFiscal.Count() > 0)
                    {
                        entregas.Add(entrega);
                    }
                }

                if (entregas.Count > 0)
                {
                    itemMonitoramento.Entregas = entregas.ToArray();
                    monitoramentoLimpo.Add(itemMonitoramento);
                }

            }
        }

The intention is to remove the foreach below and add it directly to the query of the ret variable. The foreach removes deliveries that do not have invoices, with FiscalTeam being IList within IList of Deliverables.

Any ideas how I can optimize this query?

    
asked by anonymous 13.07.2017 / 16:50

1 answer

2

As far as I can see, just put this condition inside your where :

&& p.SeuModelAteChegarNasEntregas.Entregas.Any()

After this, it will only bring those who have deliveries.

You can add after select :

.Select(MonitoramentoDto.ToDto).Where(m => m.Any(a => a.Entregas.Any()))

Edit1:

Having a list of deliveries:

Entregas.Where(m => m.NotasFiscais.Any())

Then you can use it in the first example I put up there.

    
13.07.2017 / 18:27