NHibernate QueryOver多对一投影

时间:2014-11-06 10:41:53

标签: nhibernate projection queryover

我想在QueryOver上使用投影来many-to-one工作。

课程" Post"拥有财产many-to-one"创作者"。

使用

session.QueryOver(Of Post).
Select(Projections.
Property(of Post)(Function(x) x.Creator).
WithAlias(Function() postAlias.Creator)).
TransformUsing(Transformers.AliasToBean(Of Post)()).
List()

工作但是每个创建者都是通过单个查询检索的,而不是像不使用选择/投影时那样使用连接。因此,如果有5个帖子包含5个不同的创建者,则将为帖子列表运行1个查询,为创建者运行5个查询。

我尝试使用JoinAlias让它工作,但没有真正做到这一点。

我已经搜索了一个解决方案,但是我找到的所有解决方案都使用了Linq-Provider,因为实际的"字段列表"通过参数传递。

有没有人知道除了linq提供商之外是否有解决方案?

1 个答案:

答案 0 :(得分:1)

有一个解决方案,我们可以对many-to-one使用投影,然后使用自定义结果转换器

  

免责声明:我可以阅读VB语法,但没有足够的勇气写...我希望您可以阅读C#并将其转换为VB ....

所以我们可以像这样投影:

// aliases
Post root = null;
Creator creator = null;

// projection list
var columns = Projections.ProjectionList();

// root properties
columns.Add(Projections.Property(() => root.ID).As("ID"));
columns.Add(Projections.Property(() => root.Text).As("Text"));

// reference properties
columns.Add(Projections.Property(() => creator.ID).As("Creator.ID"));
columns.Add(Projections.Property(() => creator.FirstName).As("Creator.FirstName"));

// so our projections now do have proper ALIAS
// alias which is related to domain model 
//  (because "Creator.FirstName" will be use in reflection)

var query = session.QueryOver<Post>(() => root)
    .JoinAlias(() => root.Creator, () => creator)
    .Select(columns)

现在我们需要智能的 Transformer ,我们自己的客户(可插拔性是NHibernate的强大功能)。在这里你可以找到一个:

public class DeepTransformer

我们可以像这样继续

var list = query
    .TransformUsing(new DeepTransformer<Post>())
    .List<Post>()

同时检查: