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?.
That was it!! Thank you, just out of curiosity, there is another way other than to create another variable?
– Silvio Fernando
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.
– Lucas Miranda