0

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

例如:

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

有没有办法添加“选择姓氏”之类的内容以避免下载整行。

4

4 回答 4

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>();
于 2010-04-14T20:59:45.443 回答
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 命名空间。

于 2010-04-14T20:33:46.650 回答
1

我建议尝试将 Linq 用于 NHibernate。它会让你以一种非常自然的方式做你所要求的。

于 2010-04-14T20:28:28.050 回答
0

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

于 2010-04-14T20:37:39.500 回答