views:

384

answers:

4

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.

+1  A: 

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

Tom Cabanski
That's the issue, It has so many bugs that it's no use for me in that particular situation. I hope they will improve it in NH 3.0
Jacob
Hmmm. We were using it in a fairly big project with no difficulty. Probably not pushing it enough since we were not dealing with too many complex joins.
Tom Cabanski
+2  A: 

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.

dana
A: 

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.

KeeperOfTheSoul
+3  A: 

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