나는 아마도 매우 간단한 문제가있다. 내 데이터베이스에서 나는 다음과 같은 테이블이 있습니다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
인 경우 Id
및 Name
속성이있는 Status
의 개체가 필요합니다. KeyValuePair
또는 유형이 OrderStatus
(둘 중 가장 좋음과 어느 것이 든간에) 일 수 있습니다. 주문을 가져 오는 것은 문제가되지 않지만이 속성을 가진 객체로 OrderStatus
을 추가하면 문제가있는 부분입니다. 또한 쿼리 결과를 JSON으로 클라이언트에 반환해야합니다.
OrderSummary
은 다음과 같아야합니다
public class OrderSummary {
public long Id { get; set; }
public OrderStatus Status { get; set; }
}
를 내 첫 번째 버전 OrderSummary
에서 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
이지만 클라이언트에 반환합니다. 그래서 나는 [JsonObject]
속성을 OrderStatus
클래스에 추가하는 것만 큼 간단하지 않았기 때문에 NHibernate에 대한 지식이 부족하다고 생각했습니다. 얼마나 어리석은 짓이야.
나는 다음에 내 쿼리를 변경 한 : 나는 현재이 불가능 것을 두려워
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" 결과는 괜찮은 것 같지만 json이 클라이언트에 보내지는 Order에는 OrderStatus 속성이 있지만 속성에는 실제 속성 값이 아니라 메타 데이터 만 포함되어 있습니다. –
Bunnynut
프록시 란 무엇입니까? 이 경우 상태 프로퍼티 –