Skip to content

Instantly share code, notes, and snippets.

@JobaDiniz
Created November 14, 2011 19:05
Show Gist options
  • Save JobaDiniz/1364803 to your computer and use it in GitHub Desktop.
Save JobaDiniz/1364803 to your computer and use it in GitHub Desktop.
Querying with LINQ - PoC
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