2010-04-14 101 views
0

是否有可能從Session.CreateCriteria()中選擇我想要返回的列?NHibernate查詢CreateCriteria

egz:

var x = session.CreateCriteria(); 
    x.CreateAlias("EmployeePosition", "employeePosition"); 
    x.Add(Restrictions.Eq("employeePosition.Name", "Developer")); 

,是有辦法添加類似「選擇姓氏」,以避免下載整行。

回答

3

創建一個只有您需要的屬性的類,通常這是一個類似{Id,Label}的彙總類,您可以在需要簡單類型的任何地方重複使用它,例如在列表中。使用ProjectionList來定義要返回的列。然後使用Transformers.AliasToBean將結果轉換爲簡單類型。

ProjectionList projectionList = Projections.ProjectionList(); 
projectionList.Add(Projections.Property("EmployeeID"), "Id"); 
projectionList.Add(Projections.Property("EmployeePosition"), "Label"); 
var x = DetachedCriteria.For(Employee); 
x.SetProjection(projectionList); 
x.SetResultTransformer(Transformers.AliasToBean(SimpleType))); 
return x.GetExecutableCriteria(UnitOfWork.CurrentSession).List<SimpleType>(); 
1

我建議給Linq NHibernate試試看。它會讓你以非常自然的方式去做你所要求的。

+1

這就是問題,它有很多bug,在特定情況下它對我來說沒有用處。我希望他們會在NH 3.0 – Jacob 2010-04-14 20:29:47

+0

嗯。我們毫不費力地在一個相當大的項目中使用它。因爲我們沒有處理太多複雜的連接,所以可能沒有足夠的推動它。 – 2010-04-14 20:38:19

2

你可以做到這一點使用預測:

IList<Object[]> list = session.CreateCriteria(typeof(Employee)) 
    .SetProjection(Projections.ProjectionList() 
    .Add(Projections.Property("FirstName")) 
    .Add(Projections.Property("LastName")) 
).List<Object[]>(); 

    foreach(Object[] person in list) 
    { 
    String firstName = person[0]; 
    String lastName = person[1]; 
    } 

退房的NHibernate.Expressions命名空間等預測爲好。

0

若要添加到dana's答案,如果您有一個實際的類要讀取它,您還可以使用Transformers.AliasToBean與投影。然後NHibernate會嘗試用匹配字段名稱的值來填充對象的屬性。