我正在摆弄我的存储库类,并尝试使用分离的条件执行查询。但是,我似乎并不喜欢将结果转换器设置为非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>();
现在我想知道,如果没有手动创建新会话,还有其他方法吗?
答案 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