1

私はNETMVC3.0とNhibernate3.0に取り組んでいます。データベースからオブジェクトに1つのプロパティのみをフェッチしたい。

たとえば、クラスModuleがあるとします。モジュールテーブル(クエリなど)からすべての名前を選択し、名前select modulename from moduleのみを持つモジュールオブジェクトのリストを作成したいと思います。他のすべてのプロパティはですnull

QueryOverAPIを使用してこれを試しました。

IQueryOver<ProjectModule> module = session.QueryOver<ProjectModule>()
    .Select(a=>a.Name)                   
    .TransformUsing(
        NHibernate.Transform.Transformers.AliasToBean<ProjectModule>());

pm = module.List<ProjectModule>();

pmIList<ProjectModule>タイプです。

トランザクションは正常にコミットされます。エラーは発生しませんでしたが、すべてのプロパティが=のモジュールオブジェクトのリストが表示されますnull。モジュール名null、モジュールIDnullなど。

NUnitを使用してSQLで実行されているクエリを確認し、次のように取得しましたSELECT this_Name as y0_ FROM ProjectModule this_

4

3 に答える 3

1

より正確に DTO オブジェクトを作成するには、名前のみを含む ProjectModuleDto を想定します。コードで初期化されていない値を持つドメイン オブジェクトを使用することはお勧めできません。これは、さまざまなシナリオで入力されたデータの混乱を招くためです。

そして、次のコードがそのトリックを実行します - DTO のリストを作成します: ProjectModuleDto とデータベースからのプロジェクト モジュールの正しい名前:

ProjectModuleDto projectModuleDto = null;           
IQueryOver<ProjectModule> module = session.QueryOver<ProjectModule>()
    .SelectList(
        list=>list.Select(a => a.Name).WithAlias(() => projectModuleDto.Name)
    )                 
    TransformUsing(NHibernate.Transform.Transformers.AliasToBean<ProjectModuleDto>());

pm = module.List<ProjectModuleDto>();           
于 2012-10-04T11:19:45.073 に答える
1

1 つのプロパティのみを取得する場合は、トランスフォーマーを使用する必要はありません。List<string>直接使用してみてください:

var moduleNames = session.QueryOver<ProjectModule>()
    .Select(a => a.Name)                   
    .List<string>();

NHibernate ブログで QueryOver 構文の詳細を参照してください。

于 2012-10-04T09:23:32.450 に答える
0

これはあなたが探しているものですか?

  List<ProjectModule> result = new List<ProjectModule>();

  session.QueryOver<ProjectModule>()
  .Select(a => a.Name)                   
  .ToList().ForEach(delegate(string mName)
  {
       result.Add(ProjectModule() { Name = mName });
  });
于 2012-10-04T23:24:56.970 に答える