Использование DetachedCriteria для возврата общего списка не-AR типа

Я возился с моим классом репозитория и попытался выполнить запрос с независимыми критериями. Тем не менее, мне не нравится, когда я устанавливаю преобразователь результата не AR-типа.

public class IncidentRepository
{
    public static IList<AuditReport> GetAllIncidentsToAudit()
    {
        DetachedCriteria dc = DetachedCriteria.For<Incident>("i")
            .SetProjection(
                Projections.ProjectionList()
                    .Add(Projections.Property("i.Id"), "IncidentId")
                    .Add(Projections.Property("l.Id"), "LocationId")
            )
            .CreateCriteria("Locations", "l")
                .Add(Expression.Eq("l.PrimaryLocationFlag", "T"))
            .SetResultTransformer(Transformers.AliasToBean<AuditReport>());

        return ActiveRecordMediator<AuditReport>.FindAll(dc);
    }
}

public class AuditReport
{
    public int IncidentId { get; set; }
    public int LocationId { get; set; }
}

Ошибка, которую я получаю при выполнении этого запроса:

You have accessed an ActiveRecord class that wasn't properly initialized. There are two possible explanations: that the call to ActiveRecordStarter.Initialize() didn't include castle.AuditReport class, or that castle.AuditReport class is not decorated with the [ActiveRecord] attribute.

Я понимаю ошибку, но как я могу вернуть строго типизированный список не AR типа? Я посмотрел на то, что предлагает NHibernate.Transform, но ничего не выделяется.

Кроме того, делает эту плохую практику?

Изменить: мне удалось решить эту проблему, получив доступ к базовой сессии базы данных и выполнив мои критерии оттуда.

 ISession sess = ActiveRecordMediator.GetSessionFactoryHolder().
        CreateSession(typeof(ActiveRecordBase));
    ICriteria criteria = sess.CreateCriteria<Incident>("i")
        .SetProjection(
            Projections.ProjectionList()
                .Add(Projections.Property("i.Id"), "IncidentId")
                .Add(Projections.Property("l.Id"), "LocationId")
        )
        .CreateCriteria("Locations", "l")
            .Add(Expression.Eq("l.PrimaryLocationFlag", "T"))
        .SetResultTransformer(Transformers.AliasToBean<AuditReport>());

    return criteria.List<AuditReport>();

Теперь мне интересно, есть ли другой способ достичь этого без ручного создания нового сеанса?

1 ответ

Решение

Если вы хотите использовать класс для результата преобразования, вам может потребоваться "импортировать" его в ActiveRecord.

Попробуйте украсить любой класс AR с помощью (или, возможно, AuditReport, но это может быть класс, украшенный AR):

[Import( typeof( AuditReport ), "AuditReport" )]

Это будет преобразовано в атрибут импорта NHibernate в xml-config.

Это по крайней мере решить эту проблему при использовании конструкции класса в HQL, например:

select new OrderSummary(o.Foo, count(o.Foo)) 
    from Orders o 
    group by o.Bar
Другие вопросы по тегам