采用以下 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
到父级(这是正确的术语吗?!) - 但显然Child
它的列中包含很多数据 - 我不想要所有这些额外的数据,只是描述......我如何让 NH 生成与以下查询等效的内容:
select
Header.*, Child.Description
from
Header
inner join
Child ON Header.ForeignKey1 = Child.ForeignKey1 AND Header.ForeignKey2 = Child.ForeignKey2
到目前为止,我完成这项工作的唯一方法是使用Reference
映射来引用Header
实体中的子对象,然后创建一个Header
指向 Child.Description
. 显然这意味着 NH 在查询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
表中的其余数据不感兴趣,也无法创建视图(无法更改架构)
如果可能的话,有人有什么想法吗?我将查询一大堆Header
对象,我需要该字段,Child
但我不希望查询永远占用!
这是我必须在查询级别而不是使用 hql 或 crit API 做的事情吗?
编辑:
尝试使用查询 API 使其正常工作
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);
检查 SQL 显示查询正是我想要的 - 但我得到一个异常System.Object[] is not of type Header and cannot be used in this generic collection
我认为这是因为我得到的只是一个值数组Select()
- 知道如何将其转换为Header
对象吗?
编辑:我结束了
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)
.TransformUsing(new GenericResultTransformer(typeof(Header), "HeaderID", "ForeignKey1", "ForeignKey2", "Description"));
这正是我想要的方式 - 如果有人有更好的建议我愿意接受,但就像我说的那样,我根本无法触及架构