1

采用以下 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"));

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

4

1 回答 1

1

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

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

于 2013-01-24T20:17:09.770 回答