Проблема NHibernate QueryOver <> возвращает родительскую коллекцию дочерней сущности - PullRequest
2 голосов
/ 27 мая 2011

У меня есть родительская сущность 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;
        }
    }
}

с помощью следующего запроса, чтобы получить только свойство Cat_Type_Id для Category_Types, и оно отлично работает:

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 Ответ

1 голос
/ 28 мая 2011

В зависимости от того, что вы действительно хотите вернуть, будет работать одно из следующих решений:

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 просто не является собственностью чего-либо.Это то, что говорит исключение.

...