Problem in LINQ Query

Asked

Viewed 44 times

1

In my job I need to return a list of a query LINQ. I have an expression that depending on some conditions she adds up Where to return this function. Follow the code:

public HttpResponseMessage GetPotenciaisFornecedoresProdutoFiltro(int id, [FromUriAttribute] List<int> marcas, [FromUriAttribute] List<string> UnidadesFederativas, int dias = 0, int? take = 20, int skip = 0)
    {


        var ofertas = FornecedorProdMarcaCotacaoService.GetAll().Where(p => p.ProdutoMarca.IdProduto == id
                                                       && marcas.Contains(p.ProdutoMarca.IdMarca));

        var compras = ProdutoOrdemCompraService.GetAll()
                                                    .Where(p => p.ProdutoMarca.IdProduto == id
                                                    && marcas.Contains(p.ProdutoMarca.IdMarca));

        if (UnidadesFederativas.Count() > 0)
        {
            ofertas = ofertas.Where(p => p.FornecedorCotacao.Cotacao.RequisicaoEntradaIntegra.Any(c => UnidadesFederativas.Contains(c.IdEstadoFatura)));

            compras = compras.Where(p => UnidadesFederativas.Contains(p.OrdemCompra.IdUnidadeFederativa));
        }
        if (dias > 0)
        {
            DateTime dataDaOperacao = DateTime.Now;
            dataDaOperacao = dataDaOperacao.AddDays(-dias);

            ofertas = ofertas.Where(p => p.FornecedorCotacao.Cotacao.DtCadastro >= dataDaOperacao);

            compras = compras.Where(p => p.OrdemCompra.Cotacao.DtCadastro >= dataDaOperacao);
        }

        ofertas.GroupBy(p => new { p.FornecedorCotacao.IdFornecedor, p.FornecedorCotacao.Fornecedor.Pessoa.NmPessoa, p.FornecedorCotacao.Fornecedor.Pessoa.EnderecoFatura.IdUnidadeFederativa })
            .Select(p => new { p.Key.IdFornecedor, p.Key.NmPessoa, p.Key.IdUnidadeFederativa, Count = p.Count() })
            .ToList();

        compras.GroupBy(p => new { p.OrdemCompra.IdFornecedor, p.OrdemCompra.Fornecedor.Pessoa.NmPessoa })
            .Select(p => new { p.Key.IdFornecedor, p.Key.NmPessoa, Count = p.Count() })
            .ToList();

        var query = ofertas.GroupJoin(compras, c => c.FornecedorCotacao.IdFornecedor, c => c.OrdemCompra.IdFornecedor , (o, c) => new { Ofertas = o, Compras = c });
        var count = query.Count();

        var result = query
            .SelectMany(c => c.Compras.DefaultIfEmpty(), (o, c) => new { o.Ofertas.IdFornecedor, NmPessoa = (o.Ofertas.NmPessoa + "-" + o.Ofertas.IdUnidadeFederativa), NrOfertas = o.Ofertas.Count, NrVendas = c == null ? 0 : c.Count })
            .OrderByDescending(c => c.NrVendas)
            .ThenByDescending(c => c.NrOfertas)
            .Skip(skip)
            .Take(take.Value)
            ;

        return Request.CreateResponse(HttpStatusCode.OK, new { Items = result, Total = count });

    }

I would like to know why after the Tolist() my varied offers and purchases still remain Iqueryable even after the use of type anonimo, would have another way to add the conditions?. IQueriable

1 answer

3


Looking at the documentation:

https://docs.microsoft.com/pt-br/dotnet/api/system.linq.enumerable.tolist?view=netframework-4.8

Pay attention to that detail:

Returns

List A List containing elements of the input sequence.

In other words, when using Tolist() it returns a list, but see in your code:

ofertas.GroupBy(p => new { p.FornecedorCotacao.IdFornecedor, p.FornecedorCotacao.Fornecedor.Pessoa.NmPessoa, p.FornecedorCotacao.Fornecedor.Pessoa.EnderecoFatura.IdUnidadeFederativa })
            .Select(p => new { p.Key.IdFornecedor, p.Key.NmPessoa, p.Key.IdUnidadeFederativa, Count = p.Count() })
            .ToList();

You are calling the Tolist() and you are not assigning the result to anything, the right one would be:

var variavelComRetorno = ofertas.GroupBy(p => new { p.FornecedorCotacao.IdFornecedor, p.FornecedorCotacao.Fornecedor.Pessoa.NmPessoa, p.FornecedorCotacao.Fornecedor.Pessoa.EnderecoFatura.IdUnidadeFederativa })
                .Select(p => new { p.Key.IdFornecedor, p.Key.NmPessoa, p.Key.IdUnidadeFederativa, Count = p.Count() })
                .ToList();
  • That was it!! Thank you, just out of curiosity, there is another way other than to create another variable?

  • This is very situational, you could for example already put this return directly where it would be used, this would save the variable and leave the code more streamlined, but sometimes it is much better to cherish the readability than the code economy.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.