Created
November 14, 2011 19:05
-
-
Save JobaDiniz/1364803 to your computer and use it in GitHub Desktop.
Querying with LINQ - PoC
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using Framework.Infrastructure.Repository; | |
using CRMTest.Entities; | |
using Framework.Infrastructure.Ordering; | |
using System.Linq.Expressions; | |
using System.Linq.Dynamic; | |
namespace CRMTest.Repository | |
{ | |
public class ProdutoAtivoRepository : IProdutoAtivoRepository | |
{ | |
private CRMContext Context { get; set; } | |
private ISaldoRepository saldoRepository; | |
private IQueryable<ProdutoAtivoInfo> query; | |
private IQueryable<ProdutoAtivoInfo> Query | |
{ | |
get | |
{ | |
if (this.query != null) | |
return query; | |
var querySaldo = this.saldoRepository.ListSaldoAtual(); | |
query = from itemTabelaPreco in this.Context.ItensTabelaPrecos | |
join produto in this.Context.Produtos on itemTabelaPreco.CodigoProduto equals produto.CodigoProduto | |
join tabelaPreco in this.Context.TabelaPrecos on itemTabelaPreco.CodigoTabelaPreco equals tabelaPreco.CodigoTabelaPreco | |
join referencia in this.Context.ReferenciasProdutos on produto.CodigoReferencia equals referencia.CodigoReferencia | |
join embalagemProduto in this.Context.EmbalagensProdutos on produto.CodigoEmbalagem equals embalagemProduto.CodigoEmbalagem | |
join itemProduto in this.Context.Itens on produto.CodigoItem equals itemProduto.CodigoItem | |
from saldoAtual | |
in querySaldo | |
.Where(s => s.CodigoProduto == produto.CodigoProduto) | |
.DefaultIfEmpty() | |
join produtoEstoque in | |
( | |
from produto1 in this.Context.Produtos | |
join embalagemProduto1 in this.Context.EmbalagensProdutos on produto1.CodigoEmbalagem equals embalagemProduto1.CodigoEmbalagem | |
where embalagemProduto1.FatorConversao == 1 && embalagemProduto1.FatorParaBaixaEstoque == 1 | |
select new { CodigoProdutoEstoque = produto1.CodigoProduto.Substring(0, 14) } | |
) on produto.CodigoProduto.Substring(0, 14) equals produtoEstoque.CodigoProdutoEstoque | |
join condicaoPagamentoTabelaPreco in this.Context.CondicoesPagamentoTabelaPrecoes on tabelaPreco.CodigoTabelaPreco equals condicaoPagamentoTabelaPreco.CodigoTabelaPreco | |
join condicaoPagamento in this.Context.CondicoesPagamentoes on condicaoPagamentoTabelaPreco.CodigoCondicaoPagamento equals condicaoPagamento.CodigoCondicaoPagamento | |
orderby produto.DescricaoProduto | |
select new ProdutoAtivoInfo | |
{ | |
CaixaMaster = embalagemProduto.CaixaMaster, | |
CodigoBarra = produto.CodigoBarra, | |
CodigoCondicaoPagamento = condicaoPagamentoTabelaPreco.CodigoCondicaoPagamento, | |
CodigoEmbalagem = produto.CodigoEmbalagem, | |
CodigoFabricante = itemProduto.CodigoFabricante, | |
CodigoGrupoProduto = itemProduto.CodigoGrupoItem, | |
CodigoItem = produto.CodigoItem, | |
CodigoMarca = itemProduto.CodigoMarca, | |
//CodigoPrincipioAtivoExterno = | |
CodigoProduto = produto.CodigoProduto, | |
CodigoProdutoEstoque = produtoEstoque.CodigoProdutoEstoque, | |
CodigoProdutoExterno = produto.CodigoProdutoExterno, | |
CodigoReferencia = produto.CodigoReferencia, | |
CodigoTabelaPreco = tabelaPreco.CodigoTabelaPreco, | |
CodigoTributacaoItem = itemProduto.CodigoTributacao, | |
CodigoTributacaoReferencia = referencia.CodigoTributacao, | |
CodigoUnidadeMedidaPadrao = itemProduto.CodigoUnidadeMedidaPadrao, | |
CriadoEm = produto.CriadoEm, | |
CriadoPor = produto.CriadoPor, | |
DataInicio = tabelaPreco.DataInicio, | |
DataTermino = tabelaPreco.DataTermino, | |
DescricaoEmbalagem = embalagemProduto.Descricao, | |
DescricaoItem = itemProduto.DescricaoItem, | |
//DescricaoPrincipioAtivo= | |
DescricaoProduto = produto.DescricaoProduto, | |
DescricaoReferencia = referencia.Descricao, | |
FatorConversao = embalagemProduto.FatorConversao, | |
Indice = condicaoPagamentoTabelaPreco.Indice, | |
LimiteQuantidade = itemTabelaPreco.LimiteQuantidade, | |
//MedicamentoControlado= | |
ModificadoEm = produto.ModificadoEm, | |
ModificadoPor = produto.ModificadoPor, | |
MultiplosVenda = produto.MultiplosVenda, | |
NomeCondicaoPagamento = condicaoPagamento.NomeCondicaoPagamento, | |
//NomeGrupoProduto= | |
NomeTabelaPreco = tabelaPreco.NomeTabelaPreco, | |
//QuantidadeAtendidaUltimoPeriodo= | |
SaldoAtual = saldoAtual.SaldoAtual, | |
SituacaoVenda = itemTabelaPreco.SituacaoVenda, | |
TipoTabela = tabelaPreco.TipoTabela, | |
ValorTabela = itemTabelaPreco.ValorLista | |
}; | |
return query; | |
} | |
} | |
public ProdutoAtivoRepository(IDatabaseFactory<CRMContext> databaseFactory, ISaldoRepository saldoRepository) | |
{ | |
this.Context = databaseFactory.Get(); | |
this.saldoRepository = saldoRepository; | |
} | |
public IQueryable<ProdutoAtivoInfo> ListPaged(int numberPage, int maximumRows, | |
Expression<Func<ProdutoAtivoInfo, bool>> predicate, SortCollection sortCollection) | |
{ | |
var query = this.Query; | |
query = predicate == null ? query : query.Where(predicate); | |
return query | |
.OrderBy(sortCollection.ToString()) | |
.Skip(numberPage * maximumRows) | |
.Take(maximumRows); | |
} | |
public IQueryable<ProdutoAtivoInfo> ListPagedRepresentanteConta(int codigoConta, int codigoRepresentante, int numberPage, int maximumRows, | |
Expression<Func<ProdutoAtivoInfo, bool>> predicate, SortCollection sortCollection) | |
{ | |
var query = this.Query; | |
query = predicate == null ? query : query.Where(predicate); | |
query = from produto in query | |
where | |
(from produtoRepresentante in this.Context.ProdutosRepresentantes | |
where produtoRepresentante.CodigoColaborador == codigoRepresentante | |
select produtoRepresentante.CodigoProduto) | |
.Distinct() | |
.Contains(produto.CodigoProduto) || | |
(from produtoRepresentante in this.Context.ProdutosRepresentantes | |
where | |
(from carteira in this.Context.Carteiras | |
where carteira.CodigoConta == codigoConta | |
select carteira.CodigoColaborador) | |
.Contains(produtoRepresentante.CodigoColaborador) | |
group produtoRepresentante by produtoRepresentante.CodigoProduto into gp | |
where gp.Count() >= | |
(from carteira in this.Context.Carteiras | |
where carteira.CodigoConta == codigoConta | |
select carteira.CodigoCarteira).Count() | |
select gp.Key) | |
.Contains(produto.CodigoProduto) | |
select produto; | |
return query | |
.OrderBy(sortCollection.ToString()) | |
.Skip(numberPage * maximumRows) | |
.Take(maximumRows); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment