将属性拉到父对象级别

时间:2013-01-24 18:06:29

标签: nhibernate join fluent-nhibernate fluent-nhibernate-mapping

采用以下NHibernate场景:

我有两张桌子:

Header
  HeaderID    (int),
  ForeignKey1 (int),
  ForeignKey2 (int)

Child
  ForeignKey1 (int),
  ForeignKey2 (int)
  Description (varchar)
  ...
  Metric Shed Ton Of Other Columns That Im Not InterestedIn(various types)

我正在使用Fluent NHibernate - 我想将Description对象的Child的值投影到父级(这是正确的术语吗?!) - 但显然{{1在其列中包含大量数据 - 我不想要所有额外的数据,只需要描述...我如何让NH生成以下查询的等价物:

Child

我现在唯一能做到这一点的方法是使用select Header.*, Child.Description from Header inner join Child ON Header.ForeignKey1 = Child.ForeignKey1 AND Header.ForeignKey2 = Child.ForeignKey2 映射来引用Reference实体中的子进程,然后在{{1}上创建一个非映射属性它指向Header。显然,这意味着NH在查询Header

的值之前会获取整个子对象

(我不认为复合键在这里是一个问题,连接似乎工作正常 - 它只是如何在不获取所有非感兴趣数据的情况下获取数据)

目前我的标题实体如下所示:

Child.Description

它的映射:

Description

基本上,我无法更改架构,我对public virtual int HeaderID { get; set; } public virtual int KeyColumn1 { get; set; } public virtual int KeyColumn2 { get; set; } public virtual Child Child { get; set; } public virtual string Description { get { return Child.Description; } } 表中的其余数据不感兴趣,我无法创建视图(无法更改架构)

如果有可能,任何人都有任何想法吗?我将要查询 Id(x => x.HeaderID); Map(x => x.KeyColumn1); Map(x => x.KeyColumn2); References<Child>(x => x.Child).Fetch.Join().Columns("KeyColumn1", "KeyColumn2").ReadOnly(); 个对象的大列表,我需要来自Child的字段,但我不希望查询永远占用!

这是我在查询级别而不是使用hql或crit API吗?

编辑:

尝试使用查询API

Header

检查SQL显示查询正是我想要的 - 但我得到一个异常Child

我认为这是因为我得到的只是来自Header.Session.QueryOver<Header>(() => parent) .Where(h => h.HeaderID == 1) .Inner.JoinQueryOver(x => x.Child, () => child) .Select(x => x.HeaderID, x => x.ForeignKey1, x => x.ForeignKey2, x => child.Description); 的一系列值 - 我知道如何将其转换为System.Object[] is not of type Header and cannot be used in this generic collection对象?

编辑:我最终得到了

Select()

这就是我想要的方式 - 如果有人有更好的建议我会接受它,但就像我说的那样,我根本无法触及架构

1 个答案:

答案 0 :(得分:1)

存在惰性属性的概念,但这实际上是针对相反的情况,即您想要排除少量属性。

如果这是针对演示场景,使用可以使用任何NHibernate的查询方法,只投影您喜欢的列 - 查询结果不必是完整的实体。例如,参见HQL和LINQ中的select子句,以及Criteria / QueryOver中的SetProjection()系列。