Как это сделать с помощью QueryOver от NHibernate?

В моей базе есть эти три таблицы, среди прочих

Моя модель базы данных

TRANSLATION имеет необнуляемый внешний ключ к UNIT и обнуляемый внешний ключ к ASSIGNMENT. UNIT может иметь больше назначенных ПЕРЕВОДОВ.

Я хочу выполнить один запрос, который возвращает результат со следующей структурой:

Language | Assignment | First SUM | Second SUM | Third SUM
==========================================================
    1    |     2      |    456    |    126     |     0                      
    1    |     3      |   5361    |   1367     |    89
   ...   |    ...     |    ...    |    ...     |   ...

Результаты будут сгруппированы по TRANSLATION.fk_language и TRANSLATION.fk_assignment. Основная проблема для меня - заполнить оставшиеся столбцы:

First SUM = SUM(unit.word_count)
Second SUM = SUM(unit.word_count) WHERE translation.status = 1
Third SUM = SUM(unit.word_count) WHERE translation.status = 2

Даже если я ограничусь столбцом First SUM в результате, я не смогу заставить его работать:

var result = session.QueryOver<Translation>()
                                .JoinQueryOver<Unit>(x => x.Unit)
                                .Select(Projections.Group<Translation>(x => x.Language),
                                        Projections.Group<Translation>(x => x.Assignment),                                            
                                        Projections.Sum<Unit>(x => x.WordCount))
                                .List<object>()
                                .ToList();

Это терпит неудачу с

не удалось разрешить свойство: WordCount of: Entities.Translation

Большое спасибо за любые предложения.

EDIT: вот мои сопоставления:

public class TranslationMap : ClassMap<Translation>
{
    public TranslationMap()
    {
        Table("\"TRANSLATION\"");
        LazyLoad();            
        Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_translation", "200");
        Map(x => x.Status).Column("status");
        References<Language>(x => x.Language, "fk_id_language").Not.Nullable().Cascade.None();
        References<Unit>(x => x.Unit, "fk_id_translation_unit").Cascade.None();
        References<Assignment>(x => x.Assignment, "fk_id_translator_assignment").Nullable().Cascade.None();
        DynamicUpdate();
    }
}

public class UnitMap: ClassMap<Unit>
{
    public UnitMap()
    {
        Table("\"UNIT\"");
        LazyLoad();            
        Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_translation_unit", "200");            
        Map(x => x.Text).Column("text");            
        Map(x => x.WordCount).Column("word_count");            
        HasMany(x => x.Translations).Inverse().KeyColumn("fk_id_translation_unit").Cascade.None();           
    }
}

public class AssignmentMap : ClassMap<Assignment>
{
    public AssignmentMap()
    {
        Table("\"TRANSLATOR_ASSIGNMENT\"");
        LazyLoad();            
        Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_translator_assignment", "50");           
    }
}

person twoflower    schedule 05.08.2011    source источник
comment
@Mike Майк, я обновил свой вопрос сопоставлениями.   -  person twoflower    schedule 07.08.2011


Ответы (1)


Вы сопоставили свойство WordCount вашего объекта Unit? (у вас есть такой hbm.xml)

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="Unit">
    <id name="Id" column="Id" type="Int32" >
      <generator class="native" />
    </id>
    <property name="WordCount" colum="word_count"/>
  </class>
</hibernate-mapping>
person Gluip    schedule 07.08.2011
comment
Да, простые операции работают без нареканий. Я думаю, что запрос должен быть написан по-другому, я просто не знаю, как, там не так много документации по QueryOver. - person twoflower; 11.08.2011