2009-05-21 133 views
4

我有一个问题,为我的nhibernate detachedcriteria对象创建一个投影。NHibernate投影帮助

我有一个类,它链接到表地址。

地址有一个叫做City的字段,它是一个字符串。

public class Spa : IAggregateRoot 
{ 
     [BelongsTo("AddressID", Cascade = CascadeEnum.All)] 
     public Address Address { get; set; } 
} 

我的最终目标是获得一个明确的城市名称列表。

如果我能得到所有温泉与不同的城市,我会很高兴。

我所有的尝试都是徒劳无功,还没有找到有用的帖子。

到目前为止,我已经试过:

DetachedCriteria query = DetachedCriteria.For<Spa>() 
         .CreateAlias("Address", "A") 

query.SetProjection(
     Projections.Distinct(Projections.ProjectionList() 
     .Add(Projections.Alias(Projections.Property("Address"), "A")))); 

var Spas = ActiveRecordMediator<Spa>.FindAll(query); 

我知道上面是不正确的,只是想找个地方开始。

任何帮助,将不胜感激。 还有任何简单的预测教程,将不胜感激,似乎无法找到任何直接出现在那里。

我也试过,但得到了施展的错误,寻找到它:

DetachedCriteria query = DetachedCriteria.For<Spa>() 
.CreateAlias("Address", "A") 
.SetProjection(Projections.Distinct(Projections.Property("A.City"))); 
+0

我也尝试: 的DetachedCriteria查询= DetachedCriteria.For () .CreateAlias( “地址”, “A”) .SetProjection(Projections.Distinct(Projections.Property (“一座城市”))); 但出现错误: 源数组中至少有一个元素无法被转换为目标数组类型。 – CesarHerrera 2009-05-21 16:10:36

回答

2

在我看来,有两个部分你的问题。

1.我的DetachedCriteria应该是什么样的?

如果您未执行任何其他聚合,则GROUP BY应提供与DISTINCT相同的结果。这是我将使用的查询:

var query = DetachedCriteria.For<Spa>() 
    .CreateAlias("Address", "A") 
    .SetProjection(Projections.GroupProperty("A.City")); 

2.如何使用Castle ActiveRecord执行它?

我从来没有使用过的ActiveRecord,但基于该方法的签名,我希望是这样工作的:

var cities = ActiveRecordMediator<string>.FindAll(query); 

如果你有机会到NHibernate会话,你也可以执行这样说:

var cities = query.GetExecutableCriteria(session).List<string>();