Pregunta

necesito para realizar una agregación agrupación similar a algo como esto en T-SQL:

select b.Name as [Grouped Name],
COUNT(distinct a.ID) as [Grouped Count], 
COUNT(distinct c1.ID) as [Second Group Count], 
COUNT(distinct c2.ID) as [Third Group Count]
from TableA a
left join TableB b on a.ID = b.TableAID
left join TableC c1 on a.ID = c1.TableAID and c1.SomeCondition = 1
left join TableC c2 on a.ID = c2.TableAID and c2.SomeCondition = 2
group by b.Name
order by b.Name

Me han hecho una serie de intentos de tratar de construir un modelo de objetos y luego asignarla utilizando NH3, y luego construir una consulta que se basará esta sintaxis SQL, pero he tenido poco éxito.

Es esto algo que es posible hacer uso de NH3? Si es así, ¿hay una manera de hacerlo en LINQ? o API Criterios? o HQL?

En este punto estoy abierto a cualquier cosa. Sólo necesito que señalar en la dirección correcta, porque todos los agujeros de conejo que he bajado en hasta ahora no me han llevado a ninguna parte.

El LINQ que he probado hasta ahora es la siguiente:

//act
var query = from a in session.Query<TableA>()
    orderby a.TableB.Name
    select
        new
        {
            Grouped Name = a.TableB.Name,
            GroupedCount = a.Count(),
            SecondGroupCount = a.TableC.Count(c => c.SomeCondition == 1),
            ThirdGroupCount = a.TableC.Count(c => c.SomeCondition == 2),
        };

var results1 = query.ToList();

También he probado con un grupo de, pero no importa lo que hago, NH3 siempre se produce una excepción si me refiero a TableC en más de un agregado. Si sólo tengo con un agregado, se ejecuta la consulta. Si trato de hacerlo con dos agregados, consigo una excepción.

¿Fue útil?

Solución

HQL es probablemente el camino a seguir. LINQ es demasiado permeable, Criteria es demasiado prolijo.

Algo a lo largo de las líneas de:

select b.Name as [Grouped Name],
COUNT(distinct a.id) as [Grouped Count], 
COUNT(distinct c1.id) as [Second Group Count], 
COUNT(distinct c2.id) as [Third Group Count]
from TableA a
left join a.TableB b
left join a.TableC c1 with c1.SomeCondition = 1
left join a.TableC c2 with c2.SomeCondition = 2
group by b.Name
order by b.Name

Lo que es casi lo mismo que su SQL, con ajustes menores en las uniones. No estoy completamente seguro de si el doble se unen para TableC va a funcionar, pero no hace daño a intentarlo.

En cualquier caso, si las obras de SQL, que no tiene que dejar de usarlo ... createSQLQuery siempre funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top