2011-06-23 13 views
5

Lo que quiero hacer es mostrar una grilla simple de datos que contiene los datos de la entidad y los datos agregados de sus hijos. Por ejemplo, permite usar un pedido y artículos de línea. Quiero mostrar la información de la orden y el recuento de las líneas de pedido.NHibernate QueryOver selecciona la entidad y los agregados

IdPedido, FechaPedido, NumOfLineItems

Ahora, normalmente en SQL lo puede hacer de muchas maneras. Pero esta es la única forma en que podría pensar que podría funcionar al traducir a NHibernate.

SELECT o.OrderID, OrderDate, NumOfLineItems 
FROM #Orders o 
INNER JOIN 
(SELECT o2.OrderID, COUNT(*) As NumOfLineItems FROM #LineItems l 
INNER JOIN #Orders o2 ON o2.OrderID = l.OrderID 
WHERE UserID = 1 GROUP BY o2.OrderID) t1 ON o.OrderID = t1.OrderID 
WHERE UserID = 1 

Sé que hay otras maneras, pero estoy tratando de pensar en formas que NHibernate permitirá que haga uso de la sintaxis QueryOver. No quiero usar columnas derivadas. Estoy tratando de evitar escribir SQL.

Para mis entidades, tengo una entidad Order, y una entidad AggregatedOrder, que será mi DTO en este caso, y planeo usar el aliastobean del transformador para copiar los datos en ella.

No tengo ni idea de cómo resolver esto.

Todo lo que tengo hasta ahora:

 QueryOver<LineItem> x = QueryOver.Of<LineItem>() 
      .SelectList(p => p .SelectCount(l => l.Id).WithAlias(() => itemAlias.NumOfLineItems)) 
      .JoinQueryOver<Order>(l => l.Order) 
      .Where(o => o.UserID == userID) 


     var y = session.QueryOver<Listing>() 
      .JoinQueryOver<Bid>(x); // no idea whats going on here 

Respuesta

5

dado:

public class Order 
{ 
    public virtual int OrderId {get; set;} 
    public virtual DateTime OrderDate {get; set;} 
    public virtual IList<LineItem> LineItems {get; set;} 
} 
public class LineItem 
{ 
    public virtual int Id {get; set;} 
    public virtual string Description {get; set;} 
} 

para consultar una proyección de Order + Agregada LineItem usando QueryOver API que puede hacer lo siguiente:

OrderDto orderDto = null; 
LineItem items = null; 
var results = session.QueryOver<Order>() 
    .JoinAlias(o => o.LineItems,() => items) 
    .Select(Projections.ProjectionList() 
     .Add(Projections.Property<Order>(o=>o.Id).WithAlias(()=>orderDto.OrderId)) 
     .Add(Projections.Property<Order>(o=>o.DateOrdered).WithAlias(()=>orderDto.DateOrdered)) 
     .Add(Projections.Count(()=> items.Id).WithAlias(()=>orderDto.ItemCount)) 
    ) 
    .TransformUsing(Transformers.AliasToBean<OrderDto>()) 
    .List<OrderDto>(); 
+1

Bueno, eso es desalentador. Tener que especificar cada columna va a ser una pesadilla =) – BradLaney

+0

@ user745537 Sí, puedo creer que eso sería un problema. Veré si puedo encontrar alguna otra solución. –

+0

@ user745537 Tuve tiempo para pensarlo y no sé cómo hacer lo que quieres. Otra posible solución sería usar dos consultas (una para entidades, una para el recuento agregado) y unirlas en la memoria utilizando LINQ. –

Cuestiones relacionadas