使用DetachedCriteria返回非AR类型的通用列表

时间:2010-07-27 12:38:11

标签: nhibernate castle-activerecord detachedcriteria

我正在摆弄我的存储库类,并尝试使用分离的条件执行查询。但是,我似乎并不喜欢将结果转换器设置为非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 个答案:

答案 0 :(得分:1)

如果要将类用于转换结果,则可能需要将其“导入”到ActiveRecord。

尝试使用(或者可能是AuditReport来装饰任何AR类,但它可能需要是一个AR装饰的类):

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

这将转换为xml-config中的NHibernate导入属性。

在HQL中使用类构造时,至少解决它,如下所示:

select new OrderSummary(o.Foo, count(o.Foo)) 
    from Orders o 
    group by o.Bar