次のような DTO クラスがあります。
public class Aggregates
{
public Aggregates()
{
Sales = new StatisticAggregates();
Refund = new StatisticAggregates();
}
public int ChecksAmount { get; set; }
public StatisticAggregates Sales { get; set; }
public StatisticAggregates Refund { get; set; }
public int TotalAmount { get { return Sales.Amount - Refund.Amount; } }
public double TotalPrice { get { return Sales.Price - Refund.Price; } }
}
public class StatisticAggregates
{
public int Amount { get; set; }
public double Cash { get; set; }
public double Cashless { get; set; }
public double Price { get { return Cash + Cashless; } }
}
そして、私はこのような投影リストを持っています:
Aggregates alias = null;
new List<IProjection>
{
Projections.RowCount().WithAlias(() => alias.ChecksAmount),
Projections.Sum(() => sale.Total.Amount).WithAlias(() => alias.Sales.Amount),
Projections.Sum(() => sale.Payment.Cash).WithAlias(() => alias.Sales.Cash),
Projections.Sum(() => sale.Payment.Cashless).WithAlias(() => alias.Sales.Cashless),
Projections.Sum(() => sale.Total.RefundAmount).WithAlias(() => alias.Refund.Amount),
Projections.Sum(() => sale.Refund.Cash).WithAlias(() => alias.Sales.Cash),
Projections.Sum(() => sale.Refund.Cashless).WithAlias(() => alias.Sales.Cashless),
};
クエリを次のように変換しますquery.Select(projections.ToArray()).TransformUsing(Transformers.AliasToBean<Aggregates>();
実行時に TransformUsing() は例外をスローします。
Could not find a setter for property 'Amount' in class 'Namespace.Domain.Services.Aggregates'
これは、NHibernate がメンバー式からプロパティの名前を選択するため (主要なメンバー アクセスなしで)、当然のことです。では、プロパティ Aggregates クラスのプロパティを埋めるプロジェクションを設定するにはどうすればよいでしょうか?