Tengo una lista de todos los nombres de cuenta de prefijos distintos (az), que adquiero usandoGroupBy SqlFunction en QueryOver
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>();
var q = accounts.Select(Projections.Distinct(
Projections.SqlFunction("substring",
NHibernateUtil.String,
Projections.Property("Name"),
Projections.Constant(1),
Projections.Constant(1))));
Sin embargo lo que yo quiero hacer es en lugar de devolver una lista distinta es el grupo de los prefijos y vuelta la cantidad de cuentas que comienzan con ese prefijo, pero no estoy seguro de cómo realizar un grupo al usar query over ya que no es tan sencillo como el linq estándar.
La razón por la que estoy utilizando QueryOver y no Query es porque, por alguna razón, la función de subcadena se está realizando en la memoria y no en el servidor de la base de datos.
Esto es como yo suelo hacerlo
var prefixes = (from acc in this.SessionManager.GetActiveSession().Query<Account>()
group acc by acc.Name.Substring(0, 1)
into grp
select new
{
Prefix = grp.Key,
Count = grp.Count()
});
Editar Esto es lo que he intentado, pero he recibido el siguiente error
no reconocido llamada a un método en SqlFunction expresión ("subcadena ", NHibernateUtil.String, new [] {Property (" Name "), Constant (Convert (1)), Constant (Convert (1))})
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>().Select(
Projections.Group<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1))),
Projections.Count<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1)))
);
La función de subcadena necesitaba un parámetro adicional, pero esto resolvió el problema. Muchas gracias – JConstantine