0

Session.CreateCriteria() から返される列を選択することは可能ですか?

例:

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

行全体のダウンロードを避けるために、「select LastName」のようなものを追加する方法はありますか。

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

他のプロジェクションについても NHibernate.Expressions 名前空間を確認してください。

于 2010-04-14T20:33:46.650 に答える
1

Linq to NHibernate を試してみることをお勧めします。それはあなたが求めていることを非常に自然な方法で実行させてくれます。

于 2010-04-14T20:28:28.050 に答える
0

ダナの答えに追加するには、それを読み込もうとする実際のクラスがある場合は、プロジェクションで Transformers.AliasToBean を使用することもできます。NHibernate は、一致するフィールド名からの値をオブジェクトのプロパティに設定しようとします。

于 2010-04-14T20:37:39.500 に答える