NHibernate查询选择实体和聚合

NHibernate查询选择实体和聚合,nhibernate,aggregate,queryover,correlated-subquery,Nhibernate,Aggregate,Queryover,Correlated Subquery,我想做的是显示一个简单的数据网格,其中包含实体数据及其子级的聚合数据。例如,让我们使用订单和行项目。我想显示订单信息和行项目的计数 OrderID、OrderDate、NumOfLineItems 现在,通常在SQL中,您可以通过多种方式来实现。但这是我认为在翻译成NHibernate时唯一可行的方法 SELECT o.OrderID, OrderDate, NumOfLineItems FROM #Orders o INNER JOIN (SELECT o2.OrderID, COUNT(*)

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

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,我计划使用transformer 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
QueryOver x=QueryOver.Of()
.SelectList(p=>p.SelectCount(l=>l.Id).WithAlias(()=>itemAlias.NumOfLineItems))
.JoinQueryOver(l=>l.Order)
.Where(o=>o.UserID==UserID)
var y=session.QueryOver()
.JoinQueryOver(x);//不知道这里发生了什么
给定:

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;}
}
公共类秩序
{
公共虚拟int-OrderId{get;set;}
公共虚拟日期时间OrderDate{get;set;}
公共虚拟IList行项目{get;set;}
}
公共类行项目
{
公共虚拟整数Id{get;set;}
公共虚拟字符串描述{get;set;}
}
要使用QueryOver API查询订单+聚合行项目的投影,可以执行以下操作:

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>();
OrderDto OrderDto=null;
LineItem items=null;
var results=session.QueryOver()
.JoinAlias(o=>o.LineItems,()=>items)
.Select(Projections.ProjectionList())
.Add(Projections.Property(o=>o.Id).WithAlias(()=>orderDto.OrderId))
.Add(Projections.Property(o=>o.DateOrdered).WithAlias(()=>orderedto.DateOrdered))
.Add(Projections.Count(()=>items.Id).WithAlias(()=>orderDto.ItemCount))
)
.TransformUsing(Transformers.AliasToBean())
.List();

这是令人沮丧的。必须指定每一列将是一场噩梦=)@user745537是的,我相信这将是一场痛苦。我会看看是否能找到其他解决方案。@user745537花了一些时间考虑,但我不知道怎么做。另一种可能的解决方案是使用两个查询(一个用于实体,一个用于聚合计数),并使用LINQ将它们连接到内存中。