Estoy tratando de implementar el patrón de repositorio usando ado.net debido a la limitación de la plataforma.Implementar un patrón de repositorio genérico usando ado.net antiguo
public interface IGenericRepository<T> : IDisposable where T : class
{
IQueryable<T> GetAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
void Save();
}
cómo llevar a cabo la siguiente clase abstracta ...?
public abstract class GenericRepository<C, T> :
IGenericRepository<T>
where T : class
where C : IDbDataAdapter, new()
{
private C dbDataAdapter = new C();
protected C DB
{
get { return dbDataAdapter; }
set { dbDataAdapter = value; }
}
public virtual IQueryable<T> GetAll()
{
DataTable dt;
dbDataAdapter.fill(dt);
IQueryable<T> query = dt....?;
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = dbDataAdapter.???Set<T>???().Where(predicate);
return query;
}
Actualización:
voy a poner en práctica el repositorio de dominio especificado más adelante por estos dos inherente interfaz/clase.
public class FooRepository :
GenericRepository<FooBarEntities, Foo>, IFooRepository {
public Foo GetSingle(int fooId) {
var query = GetAll().FirstOrDefault(x => x.FooId == fooId);
return query;
}
}
agreed. Hay muchos ORM disponibles. –
Agrego funciones a una aplicación heredada y no quiero traer ninguna DLL nueva. – ca9163d9
Ok, entonces tienes un hombre mes de trabajo por hacer para implementar el método FindBy. Necesita crear cadenas de SQL a partir de expresiones. Esto no es trivial * en absoluto *. Te sugiero que cambies el diseño de tu interfaz para que no admita expresiones arbitrarias. Tal vez puedas admitir una secuencia where-select-orderby-top. Quizás eso es suficiente. – usr