Question

Is it possible to chose what columns I want in return from Session.CreateCriteria() ?

egz.:

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

and is there a way to add something like "select LastName" to avoid downloading the whole row.

Was it helpful?

Solution

make a class that has only the properties you need, often this is a summary class like {Id, Label} and you'd reuse it anywhere you need a simple type, in a listing for example. Use ProjectionList to define which columns to return. Then use Transformers.AliasToBean to transform the result to your simple type.

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>();

OTHER TIPS

You can do this using Projections:

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];
  }

Check out the NHibernate.Expressions namespace for other Projections as well.

I would suggest giving Linq to NHibernate a try. It will let you do what you are asking in a very natural way.

To add to dana's answer, if you have an actual class you want to read it in to, you can also use Transformers.AliasToBean with the projection. NHibernate will then try to populate properties of the object with values from matching field names.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top