我正在尝试使用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)
感谢。
答案 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绝对棒极了。