【问题标题】:Using DetachedCriteria to return generic list of non-AR type使用 DetachedCriteria 返回非 AR 类型的通用列表
【发布时间】:2010-07-27 12:38:10
【问题描述】:

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

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

【问题讨论】:

    标签: nhibernate castle-activerecord detachedcriteria


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。很遗憾,我在工作时错过了这个回复,所以我明天试试。
    • 无论我在哪里使用 Import 属性,它仍然抱怨引用非 AR 类。查看文档,看起来 Import 属性只影响用 HQL 编写的查询。 castleproject.org/activerecord/documentation/v1rc1/manual/…
    • 哦,好吧,我害怕那个。嗯,值得一试。 Active Record 在很多方面都存在缺陷,我想你会发现自己时不时地直接使用 NHibernate(因为你无法控制二级缓存或将 HQL 与 AR iirc 一起使用。
    猜你喜欢
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2014-10-16
    • 2018-03-27
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多