2011-05-25 6 views
0

我有一个映射,有两个其他映射的引用。如何使用带有引用的投影?

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

所以我必须:

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

我想我的项目的查询,只是这6个属性。

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

我会做类似(每个参考): 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));

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

谢谢。

回答

0

我的解决方案最终需要我写一个新的变压器。我不打算粘贴代码,因为它相当长,而且现在很笨拙。但是,对于任何有兴趣:

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

我在变压器做.Add(Projections.Property("r1.property1"), "SubType.Property1")

然后别名“SubType.Property1”具有与它相关联的元组值。我将别名分开并构造一个SubType,并为与其关联的所有别名执行与现有变换器相同的操作(将值分配给该类型的那些属性),然后最后将子类型对象设置为属性的基类型。

这可能完全违背了预测的概念,但它运作良好,并且工作得非常好,因为它在几个小时内就被黑了。

+0

因此,您基于用户选择的列部分构建基本类型?基类中的其他属性是否仅获取默认值? – 2011-07-01 14:49:51

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; 
} 
+0

有什么方法可以投影到原始类型上吗?我在该基表中有100列,用户可以选择查看这100个的任意组合。 – Harry 2011-05-25 13:19:06

+0

你可以但我不认为它会帮助你满足动态显示要求。 – 2011-05-25 13:29:34

+0

如何?当然,基础实体中的其他值可以是默认值,我确实需要的属性是预测值? – Harry 2011-05-25 13:36:31