【问题标题】:NHibernate QueryOver select entity and aggregatesNHibernate QueryOver 选择实体和聚合
【发布时间】:2011-06-23 23:55:23
【问题描述】:

我想要做的是显示一个简单的数据网格,其中包含实体数据及其子项的聚合数据。例如,让我们使用订单和订单项。我想显示订单信息,以及订单项的数量。

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

【问题讨论】:

    标签: nhibernate aggregate queryover correlated-subquery


    【解决方案1】:

    给定:

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

    要使用 QueryOver API 查询 Order + Aggregated LineItem 的投影,您可以执行以下操作:

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

    【讨论】:

    • 这令人沮丧。必须指定每一列将是一场噩梦 =)
    • @user745537 是的,我相信那会很痛苦。我会看看我是否能找到任何其他解决方案。
    • @user745537 有时间考虑一下,但我不知道如何做你想做的事。另一种可能的解决方案是使用两个查询(一个用于实体,一个用于聚合计数)并使用 LINQ 在内存中将它们连接在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多