Skip to content

Instantly share code, notes, and snippets.

@claudiosanchez
Last active August 29, 2015 13:57
Show Gist options
  • Save claudiosanchez/a663c5625d98df22d49c to your computer and use it in GitHub Desktop.
Save claudiosanchez/a663c5625d98df22d49c to your computer and use it in GitHub Desktop.
...
// _repository is a GenericRepository<Villa>.
var villas = _repository
.Get(
q => q.Select(s => new VillaDto {
Id = s.PodId,
Name = s.Name,
Price=s.Price,
Location = s.Location }),
f => f.Location == "Punta Cana",
o => o.OrderBy(i => i.Price)
);
...
public IEnumerable<TResult> SuperGet<TResult>(
Func<IQueryable<TEntity>, IQueryable<TResult>> transform,
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TResult>, IOrderedQueryable<TResult>> orderBy = null)
{
// _dbSet is DbSet<TEntity> property of a DbContext
var query = (filter == null) ? _dbSet : _dbSet.Where(filter);
var notSortedResults = transform(query);
return orderBy == null ? (IEnumerable<TResult>) notSortedResults : orderBy(notSortedResults).ToList();
}
@jalvarezz
Copy link

Wilson, actualmente trabajo para una compania que distribuye productos de telefonicas y las cosas cambian muchas veces. Solo estoy yo en la parte Web y hay muchas cosas que la hacen con procedures porque el tiempo no me permite hacerlas. El factor comunicacion aqui es una basura y solo por eso los usamos.

Mira como llamo uno de los SP bajo el metodo que coloque mas arriba (omito el nombre real del SP y las propierdades :P):

//storeId es STRING, dateFrom es DateTime, dateTo es DateTime
using (UnitOfWork uow = new UnitOfWork())
{
    //Sps_ProcedimientoX_Result
    var result = uow.
                 GetProcedureRepository<ProcedureX_Result>().
                 ExecuteStoredProc<ProcedureXDTO>(x => x.Select(r => new ProcedureXDTO
                                                  {
                                                          Prop1 = r.Prop1,
                                                          Prop2 = r.Prop2,
                                                          Prop3 = r.Prop3,
                                                          ...
                                                  }), new object[] { storeId, dateFrom, dateTo });

    return result;
}

En la BD se ejecutaria lo siguiente:

EXEC ProcedureX @iStoreId = 'storeId', @iTxnDateFrom = 'dateFrom', @iTxnDateTo = 'dateTo'

No tengo que ocupar mi tiempo instanciando los object parameters :)

@specificityy
Copy link

Oh ok, ya entiendo.. el transform es el mapper.. como con el ExecuteFunction se mapean las propiedades automaticamente de acuerdo al nombre.. no pense era necesario el transform.. pero eso de objectParameters si es un lio..^_^

Reflexion for the win! ^_^

@claudiosanchez
Copy link
Author

Javier, haz el pull request para aceptar tu aporte en el repo.

@jalvarezz
Copy link

No he realizado el Pull Request con el cambio porque se me queda en el trabajo :P Manana lo hago.

Tengo varias preguntas para ustedes dos. Si yo tengo 5 condiciones en el filtro pero son opcionales, como le hago para que en el Query que se ejecuta en la base de datos, las que son opcionales ni siquiera aparezcan en el WHERE? Pienso que es lo que hace falta ahora mismo.

@claudiosanchez
Copy link
Author

A que te refieres cuando dices que tus condiciones son opcionales?

Puedes proveer un ejemplo concreto?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment