Domanda

E 'possibile scegliere quali colonne che voglio in cambio da Session.CreateCriteria ()?

EGZ:.

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

e c'è un modo per aggiungere qualcosa come "selezionare Cognome" per evitare di scaricare l'intera riga.

È stato utile?

Soluzione

fare una classe che ha solo le proprietà necessari, spesso si tratta di una classe di sintesi come {Id, Etichetta} e che ci si riutilizzarlo ovunque avete bisogno di un tipo semplice, in un elenco per esempio. Utilizzare ProjectionList per definire le colonne da restituire. Quindi utilizzare Transformers.AliasToBean per trasformare il risultato al vostro tipo semplice.

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

Altri suggerimenti

È possibile farlo utilizzando proiezioni:

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

Scopri il namespace NHibernate.Expressions per altre proiezioni pure.

vorrei suggerire di dare LINQ to NHibernate una prova. Esso ti consente di fare quello che chiedete in un modo molto naturale.

scroll top