NHibernate查询CreateCriteria

时间:2010-04-14 20:26:09

标签: c# nhibernate orm createcriteria

是否可以从Session.CreateCriteria()中选择我想要的列?

egz:

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

并且有一种方法可以添加“select LastName”之类的内容,以避免下载整行。

4 个答案:

答案 0 :(得分: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 :(得分: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];
  }

查看其他Projections的NHibernate.Expressions命名空间。

答案 2 :(得分:1)

我建议尝试给Linq NHibernate。它会让你以非常自然的方式做你想要的事情。

答案 3 :(得分:0)

要添加到dana's答案,如果您有想要阅读的实际课程,您还可以将Transformers.AliasToBean与投影一起使用。然后,NHibernate将尝试使用匹配字段名称的值填充对象的属性。