私はおそらく非常に単純な問題を抱えています。私のデータベースで は、私には、次の表があります。NHibernateは、関連する子オブジェクトを持つオブジェクトのリストをQueryOverで選択します。
tblOrder
-----------------
Id
OrderStatusId
tblOrderStatus
-----------------
Id
Name
をそして私は私のプロジェクトで、次のマッピングを行った。
[Class(NameType = typeof(Order), Table = "tblOrder")
public class Order {
[Id(-2, Name = "Id")]
[Generator(-1, Class = "native")]
public virtual long Id { get; set; }
[ManyToOne]
public virtual OrderStatus Status { get; set; }
}
[Class(NameType = typeof(OrderStatus), Table = "tblOrderStatus")]
public class OrderStatus {
[Id(-2, Name = "Id")]
[Generator(-1, Class = "native")]
public virtual long Id { get; set; }
[Property]
public virtual string Name { get; set; }
}
クエリがIList<OrderSummary>
を返す必要があります。クラスOrderSummary
にはプロパティStatus
があります。ここでStatus
はId
とName
プロパティを持つオブジェクトです。これは、KeyValuePair
またはタイプOrderStatus
のいずれか(どちらが最善で動作するか)のいずれかである可能性があります。注文を取得することは問題ではありませんが、OrderStatus
をオブジェクトとして追加することは、私が問題を抱えている部分です。 また、クエリの結果をJSONとしてクライアントに返す必要があります。
OrderSummary
は次のようになります。私の最初のバージョンOrderSummary
で
public class OrderSummary {
public long Id { get; set; }
public OrderStatus Status { get; set; }
}
はOrderStatusId
とOrderStatusName
のための独立した性質を有していました。これは動作しますが、私はこれらの別々のプロパティを避けようとしています。 私はSelectSubQuery
でこれを試しましたが、サブクエリに複数のフィールドを返すため、エラーが返されます。
-----------------------------------アップデート----------
がvar query = session.QueryOver<OrderStatus>
.Fetch(o => o.Status).Eager
.JoinAlias(o => o.Status,() => statusAlias, JoinType.LeftOuterJoin);
問題は次のとおりです。-------------------
フレディTrebouxのアドバイスに続いて、私は次のクエリの結果Eager
を使用して、私のクエリを変更しました、私は、データを選択していないが、検索されたStatus
を変換し、それをOrderSummary.Statusに割り当てる方法を見つけましたか?私は以下を試した:
OrderSummary orderAlias = null;
query.SelectList(list => list
.Select(o => o.Id).WithAlias(() => orderAlias.Id)
.Select(() => statusAlias).WithAlias(() => orderAlias.Status)
).TransformUsing(Transformer.AliasToBean<OrderSummary>());
-------------------------------- ANSWER ---- ------------------------------
最後に編集したように、この問題は実際の選択はOrderStatus
ですが、それをクライアントに返します。だから、NHibernateの知識が不足していると思ったのですが、[JsonObject]
属性をOrderStatus
クラスに追加するだけで簡単でした。私の愚かなこと。
は、私は次のように私のクエリを変更している:私は現在、それが不可能だと怖い
Order orderAlias = null;
OrderSummary orderSummary = null;
OrderStatus statusAlias = null;
var query = session.QueryOver<Order>(() => orderAlias)
.JoinAlias(() => orderAlias.Status,() => statusAlias, JoinType.LeftOuterJoin);
query = query
.Select(
Projections.ProjectionList()
.Add(Projections.Property(() => orderAlias.Id).WithAlias(() => orderSummary.Id))
.Add(Projections.Property(() => orderAlias.Status).WithAlias(() => orderSummary.Status)
);
Result = query.TransformUsing(Tranformers.AliasToBean<OrderSummary>())
.List<OrderSummary>()
.ToList();
はこちらをご覧ください:https://stackoverflow.com/questions/29644236/use-nhibernate-aliastobean-transformer-launch-n1-クエリ –
私はあなたがそこに投稿したリンクは、コメントに入れられた解決策を使用しています: 'var query = session.QueryOver() .SelectList(list => ).Select(Projections.Property(" OrderStatus "結果はOKですが、jsonがクライアントに送信されるOrderにはOrderStatusプロパティが含まれていますが、プロパティにはメタデータのみが含まれており、プロパティの実際の値は含まれていません。 –
Bunnynut
プロキシーを意味しますか?この場合、Statusプロパティのlazyloadingを無効にしてください。 –