2010-04-14 102 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会尝试用匹配字段名称的值来填充对象的属性。