采用以下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()
这就是我想要的方式 - 如果有人有更好的建议我会接受它,但就像我说的那样,我根本无法触及架构
答案 0 :(得分:1)
存在惰性属性的概念,但这实际上是针对相反的情况,即您想要排除少量属性。
如果这是针对演示场景,使用可以使用任何NHibernate的查询方法,只投影您喜欢的列 - 查询结果不必是完整的实体。例如,参见HQL和LINQ中的select子句,以及Criteria / QueryOver中的SetProjection()系列。