2

我有一个父实体 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<> 编写了一个查询来获得与 sql 查询相同的结果,并将结果放入 EntityTotals<> 类中,如下所示:

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:费用

所以我试图只将 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 的完整对象?

谢谢 ;

4

1 回答 1

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它根本不是任何东西的属性。这就是异常所说的。

于 2011-05-27T21:17:18.570 回答