在NHibernate的相关实体上使用SQLProjection

时间:2010-11-25 15:44:14

标签: nhibernate criteria projection

我正在尝试使用Criteria API来解决如何执行以下操作。

我有3个相关实体, 例如承租人,建筑物和所有者,其中承租人拥有建筑物属性,而建筑物拥有所有者财产。所有者具有First和Lastname属性。

我想检索所有租户和所有者全名

即。 SQL将是

select o.FirstName + ' ' + o.LastName as OwnerName, t.Name from Tenant t inner join Building b on t.BuildingId = b.BuildingId inner join [Owner] o on b.OwnerId = o.OwnerId

当我使用Criteria API为Tenant创建查询时,是否有一种方法可以添加一个投影,它将为我提供连接的所有者名称? (我还没有发现如何为根实体以外的任何东西添加SQLProjection)

感谢。

3 个答案:

答案 0 :(得分:1)

向每个ICriteria(每个实体)添加一个别名。然后在投影中你可以使用符号:

*alias.property*

您应该在DTO对象中进行连接。

答案 1 :(得分:0)

在我的View / DTO对象中(无论你怎么称呼它),我会添加一个这样的附加属性:

public MyDTO
{
    public string FirstName
    {
       get;
       private set;
    }

    public string LastName
    {
        get;
        private set;
    }

    public string Name
    {
        get
        {
            return String.Format ("{0} {1}", FirstName, LastName);
        } 
    }
}

答案 2 :(得分:-1)

不幸的是我没有使用ICriteria API,因此我无法专门帮助您。但是,有了Linq到NHibernate,我很确定你能做到这样的事情:

var tenantsAndOwners = session.Linq<Tenant>().Select(tenant => new { TenantName = tenant.Name, OwnerFullName = tenant.Building.Owner.FirstName + " " + tenant.Building.Owner.LastName });

这将返回一个匿名类型,其中包含两个属性'TenantName'和'OwnerFullName'。匿名类型只存在于当前作用域中,即无法作为方法的返回类型传递。

我担心这段代码没有经过考验,因为我太忙于抓着咖啡而发抖,但我很确定这样的东西会起作用。 Linq到NHibernate绝对棒极了。