如何使用参考预测?

时间:2011-05-25 10:31:13

标签: c# nhibernate

我有一个映射,它有两个对其他两个映射的引用。

首先,我会创建子标准还是创建别名?

所以我有:

Base.Property1 Base.Property2 Base.Reference1.Property1 Base.Reference1.Property2 Base.Reference2.Property1 Base.Reference2.Property2

我想将查询投影到这6个属性。

我已经设法在一个表的查询上使用Projections,但是在涉及多个表时我遇到了困难。

我会做什么(对于每个参考): criteria.CreateCrtieria(bla) .SetProjection(Projections.ProjectionList() .Add(/*Add projections*/)) .SetResultTransformer(Transformers.AliasToBean(type));

或者只是创建别名并对原始条件进行投影,如下所示:

criteria.CreateAlias("reference1", "r1").CreateAlias("reference2", "r2") .SetProjection(Projections.ProjectionList() .Add(Projections.Property("baseProperty1") .Add(Projections.Property("r1.property1") .Add(Projections.Property("r2.property2")) /*etc*/ .SetResultTransformer(Transformers.AliasToBean(baseType));

我不知道前两个想法是否真的有效 - 他们似乎没有,但我不知道是不是因为我忘记了某些事情,或者他们是否完全错误。

感谢。

2 个答案:

答案 0 :(得分:1)

使用Criteria API上的CreateAlias方法,您可以连接到引用的对象,并允许您突出显示属性。

您为每个引用的类型分配一个别名,然后您可以使用它来访问引用对象的属性。

另请注意,您需要确保投影对象中属性的名称与投影列表完全匹配。

你也可以在CreateAlias方法上指定JoinType,如果你想强制使用InnerJoin而不是LeftJoin。

var query = session.CreateCriteria<Base>()
             .CreateAlias("Base.Reference1","ref1")
             .CreateAlias("Base.Reference2","ref2")
             .SetProjection(
               Projections.ProjectionList()
               .Add(Projections.Property("Base.BaseProperty"),"DtoBaseProperty")
               .Add(Projections.Property("ref1.property1"),"DtoProperty1")
               .Add(Projections.Property("ref2.property2"),"DtoProperty2")
             )
             .SetResultTransFormer(Transformers.AliasToBean(typeof(ProjectionDto)))
             .List<ProjectionDto>();

public class ProjectionDto{
    public string DtoBaseProperty;
    public string DtoProperty1;
    public string DtoProperty2;
}

答案 1 :(得分:0)

我的解决方案最终要求我写一个新的Transformer。我不会粘贴代码,因为它相当长,而且目前非常hacky。但对于任何有兴趣的人:

而不是.Add(Projections.Property("r1.property1")

我做了.Add(Projections.Property("r1.property1"), "SubType.Property1")

然后在变换器中,别名“SubType.Property1”具有与之关联的元组值。我将别名拆分并构造一个SubType,对于与之关联的任何别名,执行与现有转换器相同的操作(为该类型的那些属性赋值),然后最终将子类型对象设置为值。基本类型的财产。

它可能完全违背了Projections的概念,但它可以正常工作,而且效果很好,因为它在几个小时内就被黑了。