2

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

现在我想知道,是否还有另一种方法可以在不手动创建新会话的情况下实现这一目标?

4

1 回答 1

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
于 2010-07-27T16:41:18.960 回答