2010-11-25 40 views
1

我想了解如何使用Criteria API執行以下操作。在NHibernate的相關實體上使用SQLProjection

我有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

當我創建一個查詢使用標準API租客,是有辦法,我可以添加一個投影,它會給我連接的所有者名稱? (我還沒有發現如何爲根實體以外的任何東西添加SQLProjection)

謝謝。

回答

1

爲每個ICriteria(每個實體)添加一個別名。然後在投影內你可以使用符號:

*alias.property* 

串聯你應該在你的DTO對象中做。

+0

謝謝,我目前正在做類似的事情,但我想知道是否有可能使用Criteria API生成類似上面的SQL。 – 2010-11-26 08:25:13

0

在我看來/ 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); 
     } 
    } 
} 
+0

我傾向於在我的DTO中避免像這樣的「計算」屬性,因爲客戶端代碼將不知道該屬性無法查詢。更好地使用像string fullName = NameFormatter.Format(firstName,lastName,NameFormat.FirstNameSpaceLastName)我想。 – David 2010-11-26 09:15:48

0

不幸的是我沒有使用的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」返回匿名類型。匿名類型只存在於當前作用域中,即不能作爲方法的返回類型傳遞。

恐怕這段代碼沒有經過測試,因爲我太忙了,抓着我的咖啡和發抖,但我很確定這樣的事情會起作用。而NHibernate的Linq絕對是很棒的。