NHibernate QueryOver выберите объект и агрегаты - PullRequest
5 голосов
/ 24 июня 2011

Что я хочу сделать, это отобразить простую сетку данных, которая содержит данные сущности и совокупные данные ее дочерних элементов. Например, давайте использовать порядок и позиции. Я хочу отобразить информацию о заказе и количество позиций.

OrderID, OrderDate, NumOfLineItems

Теперь обычно в SQL вы можете делать это разными способами. Но это единственный способ, с помощью которого я мог бы сработать при переводе в 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

Я знаю, что есть и другие способы, но я пытаюсь придумать, как NHibernate позволит мне использовать синтаксис QueryOver. Я не хочу использовать производные столбцы. Я пытаюсь избежать написания SQL.

Для моих сущностей у меня есть сущность Order и сущность AggregatedOrder, которая в этом случае будет моим DTO, и я планирую использовать aliastobean преобразователя для копирования данных в него.

Я просто понятия не имею, как это выяснить.

Все, что у меня есть до сих пор:

        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

1 Ответ

5 голосов
/ 30 июня 2011

Дано:

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;}
}

Чтобы запросить проекцию Order + Aggregated LineItem с помощью API QueryOver, вы можете сделать следующее:

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>();
...