/*
         * Mejoras:
         * Mandar directamente un ICriteria estría mal ya que el cliente dependería de nhibernate
         * tal vez habría que hacer una especie de jerarquia con sus con controladores (igual que
         * los request. Entonces podría tener distintos selectores (todos genericos): por id,
         * por consulta, por example, composite, etc. y si necesito algún caso especial no generico
         * hacerlo que herede de alguno de los genéricos.
         * También hay que hacer algo para devolver un conjunto de resultados cuando es múltiple.
         * */

        public static EntityType GetEntity <EntityType>(this Selector <EntityType> selector, PersistenceContext context)
            where EntityType : Entities.Base.Entity, new()
        {
            if (selector.Multiple)
            {
                throw new Exception("El selector especificado es múltiple por lo tanto debuelve un arreglo sde entidades");
            }
            else
            {
                EntityType entity = null;

                if (selector.Example == null && selector.Id > 0)
                {
                    entity = context.Session.Load <EntityType>(selector.Id);
                }
                else if (selector.Example != null && selector.Id <= 0)
                {
                    ICriteria criteria = context.Session.CreateCriteria(typeof(EntityType));
                    criteria.Add(
                        Example.Create(selector.Example)
                        .ExcludeZeroes()    //exclude null or zero valued properties
                        .IgnoreCase()       //perform case insensitive string comparisons
                        .EnableLike()       //use like for string comparisons
                        );
                    entity = criteria.UniqueResult <EntityType>();
                }
                else
                {
                    throw new Exception("El criterio no es válido.");
                }

                return(entity);
            }
        }
 protected abstract ResponseType RunInContext(RequestType request, PersistenceContext context);