Vou demonstra aqui uma forma bem rápida e produtiva para criarmos um repositório genérico com Linq to SQL. Basicamente devemos efetuar quatro operações básicas: Selecionar os dados, salvar, apagar e atualizar.
Vejamos como ficaria nossa interface para o repositório genérico:
public interface IRepositorio
{
void Atualiza();
void Apaga<TEntidade>(TEntidade entidade) where TEntidade : class;
void Salva<TEntidade>(TEntidade entidade) where TEntidade : class;
IQueryable<TEntidade> Seleciona<TEntidade>() where TEntidade : class;
}
Pegou a idéia com Generics? veja a implementação:
public class Repositorio : IRepositorio
{
private readonly DBDataContext _db;
public Repositorio (DBDataContext db)
{
_db = db;
}
public void Atualiza()
{
_db.SubmitChanges();
}
public void Apaga<TEntidade>(TEntidade entidade) where TEntidade : class
{
_db.GetTable<TEntidade>().DeleteOnSubmit(entidade);
Atualiza();
}
public void Salva<TEntidade>(TEntidade entidade) where TEntidade : class
{
_db.GetTable<TEntidade>().InsertOnSubmit(entidade);
Atualiza();
}
public IQueryable<TEntidade> Seleciona<TEntidade>() where TEntidade : class
{
return _db.GetTable<TEntidade>();
}
}
Legal não? Simples e eficaz. Veja como podemos utilizar este repositório:
public class Negocio : INegocio
{
private static IRepositorio _repositorio;
public Negocio(IRepositorio db)
{
_repositorio = repositorio;
}
public void Chamadas()
{
//Seleciona os registros (Produtos)
IQueryable<Produto> colecao = _repositorio.Seleciona<Produto>();
Produto produto = colecao.Where(p => p.cod == 1).FirstOrDefault();
produto.nome = "caixa";
//Submete as alterações no produto selecionado
_repositorio.Atualiza();
Produto p = new Produto() { nome = "Caixa", valor = 100 };
//Salva o novo produto
_repositorio.Salva<Produto>(p);
//Apaga o produto
_repositorio.Apaga<Produto>(p);
}
}
Claro que o uso de outros conceitos e patterns como IoC e UoW são essenciais!
Bom código! 






Não estaria faltando neste repositório um método para “Update” das entidades?
Olá João,
Na verdade não, quando trabalhamos com Linq to SQL nossos updates são realizados efetuando um SubmitChanges() no próprio contexto, ou seja o método Atualiza(), veja:
Produto produto = colecao.Where(p => p.cod == 1).FirstOrDefault();
produto.nome = “caixa”;
//Submete as alterações no produto selecionado (UPDATE)
_repositorio.Atualiza();
Isso seria um update!
Abs
Entendi, essa técnica vale também para o linq to entities.
Tenho trabalhado o linq to entities com o MVC 2 e 3 mas usando as técnicas utilizadas no MVC 1 (repository e service).
Creio que está na hora de atualizar minha abordagem ao banco de dados.
Valeu pela resposta.
Abs
Ops, aqui é uma pergunta:
Entendi, essa técnica vale também para o linq to entities?
Sim, seria basicamente a mesma ideia, porém, com as palavras chaves do “Entity”, ou seja:
Ao invés de utilizar SubmitChanges() você utilizaria SaveChanges() no método Atualiza().
Veja um artigo muito interessante que demonstra isso:
http://fabioalveslopes.wordpress.com/2011/05/02/repositorio-de-dados-generico/
Abs