0

私は次のようにNhibernateでマップされたモデルを持っています:

public class A
{
   public virtual long Id { get; set; }
   public virtual long Number { get; set; }

   /* and other 20 properties... */
}


public class B
{
   public virtual long Id { get; set; } 
   public virtual A ItemA { get; set; }
   public virtual string Name { get; set; }
   public virtual DateTime Date { get; set; }
}

クエリ(queryover、linq、hqlなど)を作成して、List<B>ItemAプロパティにIdプロパティとNumberプロパティのみを入力します。これは、このプロパティのみが必要なためです(Aクラスには多くのプロパティがあります。私の結果には使用しないでください)。これを行う方法はありますか、それとも作成する必要がありますViewModelか?を作成する必要がある場合ViewModel、どうすればこれを行うことができQueryOverますか?

ありがとうございました!

4

2 に答える 2

1

はい、次のようにビューモデルを作成する必要があります。

public class BViewModel
{
    public virtual long Id { get; set; } 
    public virtual AViewModel ItemA { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime Date { get; set; }
}

public class AViewModel
{
    public virtual long Id { get; set; }
    public virtual long Number { get; set; }
}

これで、次のようにlinqを使用してクエリを実行できます。

var listOfB = session.Query<B>()
    .Select(b => new BViewModel
        {
            Id = b.Id,
            Name = b.Name,
            Date = b.Date,
            ItemA = new AViewModel 
                {
                    Id = b.ItemA.Id,
                    Number = b.ItemA.Number,
                },
        }).ToList();
于 2012-07-20T14:29:44.720 に答える
-1

を使用すると、AとBを結合し、必要なプロパティのみを取得するためにQueryOver使用できます。 次に、を使用して結果を任意の形式に変換します。 次のようなもの: JoinAliasSelectList
TransformUsing

A aTemplate = null;
s.QueryOver<B>().
  .JoinAlias(() => aTemplate)
  .Where (/*whatever conditions*/)
  .SelectList(list => list
      .Select(() => aTemplate.Id)
      .Select(() => aTemplate.Number)
  .TransformUsing(Transformers.AliasToBeanTransformer)
  .List<A/*or some DTO*/>();
于 2012-07-20T13:53:45.550 に答える