NHibernate QueryOver<>问题返回子实体的父集合

时间:2011-05-27 11:31:12

标签: nhibernate queryover

我有一个父实体Category_Types,其中包含一组子实体类别这些子实体中的每一个都有一个子实体的集合费用:

Category_Types>>类别(1:n),类别>>费用(1:n)

我想查询特定日期之间特定Category_Type的总费用 进入以下未映射的类

public class EntityTotals<T>
{
    T _Entity;
    public T Entity
    {
        get
        {
            return _Entity;
        }
        set
        {
            _Entity = value;
        }
    }
    decimal _Total;
    public decimal Total
    {
        get
        {
            return _Total;
        }
        set
        {
            _Total = value;
        }
    }
}

我有以下sql查询:

select ct.Cat_Type , SUM(isnull(e.Spends,0)) from Expenses e right join Categories c    on e.Category_Id = c.Category_Id
right join Category_Types ct on ct.Cat_Type_Id = c.Cat_Type_Id
where e.Spend_Date between @from and @to
group by ct.Cat_Type 

所以我使用QueryOver&lt;&gt;写了一个查询获得相同的sql查询结果 我将结果导入EntityTotals&lt;&gt;课程如下:

Expenses e = null;
Categories c = null;
Category_Types ct = null;
return Session.QueryOver<Expenses>((() => e))
    .JoinAlias(() => e.Category, () => c)
    .JoinAlias(() => c.Category_Type, () => ct)
    .WhereRestrictionOn(() => e.Spend_Date)
    .IsBetween(from)
    .And(to)
    .SelectList(list => list
        .SelectGroup(() => ct)
        .SelectSum(ee => ee.Spends))
        .List<object[]>()
        .Select(exp =>
            new EntityTotals<Categories>()
            {
                Entity = (Categories)exp[0],
                Total = (decimal)exp[1]
            })
            .ToList<EntityTotals<Categories>>();

当我测试此查询时,它给了我以下异常:

无法解析属性:ct of:Expenses

所以我试图将Category_Types的一些属性添加到下面的未映射类

public class Totals
{
    int _Id;
    public int Id
    {
        get
        {
            return _Id;
        }
        set
        {
            _Id = value;
        }
    }
    decimal _Total;
    public decimal Total
    {
        get
        {
            return _Total;
        }
        set
        {
            _Total = value;
        }
    }
}

使用以下查询仅获取Category_Types的属性Cat_Type_Id并且它正常工作:

Expenses e = null;
Categories c = null;
Category_Types ct = null;
return Session.QueryOver<Expenses>((() => e))
      .JoinAlias(() => e.Category, () => c)
      .JoinAlias(() => c.Category_Type, () => ct)
      .WhereRestrictionOn(() => e.Spend_Date)
      .IsBetween(from)
      .And(to)
      .SelectList(list => list
          .SelectGroup(() => ct.Cat_Type_Id)
          .SelectSum(ee => ee.Spends))
          .List<object[]>()
          .Select(exp =>
              new Totals()
              {
                  Id = (int)exp[0],
                  Total = (decimal)exp[1]
              })
              .ToList<Totals>();

那么如何从第一个查询中获取Category_Types的完整对象?

谢谢;

1 个答案:

答案 0 :(得分:1)

根据您实际想要返回的内容,以下解决方案之一将起作用:

1)如果你想返回EntityTotals<Categories>,请执行以下操作:

.SelectList(list => list
    .SelectGroup(() => e.Category)
    .SelectSum(ee => ee.Spends))
    .List<object[]>()
    .Select(exp =>
        new EntityTotals<Categories>()
        {
            Entity = (Categories)exp[0],
            Total = (decimal)exp[1]
        })
        .ToList<EntityTotals<Categories>>();

2)如果你想返回EntityTotals<Category_Types>,请执行以下操作:

.SelectList(list => list
    .SelectGroup(() => c.Category_Type)
    .SelectSum(ee => ee.Spends))
    .List<object[]>()
    .Select(exp =>
        new EntityTotals<Category_Types>()
        {
            Entity = (Category_Types)exp[0],
            Total = (decimal)exp[1]
        })
        .ToList<EntityTotals<Category_Types>>();

您不能.SelectGroup(() => ct),因为ct根本不是任何属性。这就是例外所说的。