2009-04-28 6 views
2

NHibernate 투영에 익숙하지 않습니다. IList <>이 아닌 List <>을 반환 할 수 있도록 사용하려고합니다. 나는 아직 DTO에 투영하는 데 많은 행운이 없다. 다음과 같은 쿼리 및 도메인 개체가 있습니다. 그래서 EmployeeID가 주어진 Orders 목록을 얻으려고합니다. 나는이 목록을 serialize 할 수 있기를 원하기 때문에 결과 목록을 반복하고 List에 추가하고 있습니다. 아무도 내가 투영과 얼마나 멀리 떨어져 있는지 말할 수 있습니까? 나는 내 자신과 비슷하지 않은 몇 가지 예를 수색하고 발견했다. 기본적으로 .. 단지 DTO리스트를 만들고 싶습니다.NHibernate 투영 DTO

감사합니다.

public List<EmployeeOrder> GetEmployessOrdersDTO(int empid) 
     { 
     var emporders = new List<EmployeeOrder>(); 

     ICriteria criteriaSelect = NHibernateSessionManager.Instance.GetSession().CreateCriteria(typeof (Orders)) 
      .CreateCriteria("Employees") 
      .Add(Expression.Eq("EmployeeID", empid)); 

     criteriaSelect.SetProjection(
      Projections.ProjectionList() 
      .Add(Projections.Property("Products"), "OrderedProducts")); 


     criteriaSelect.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(EmployeeOrder))); 
     criteriaSelect.List<EmployeeOrder>(); 

     foreach (var order in emporders) 
     { 
      emporders.Add(order); 
     } 
     return emporders; 
    } 

주문 :

public class Orders 
{ 
    public virtual int OrderID { get; private set;} 
    public virtual string CustomerID { get; set; } 
    public virtual DateTime OrderDate { get; set; } 
    public virtual DateTime RequiredDate { get; set; } 
    public virtual DateTime ShippedDate { get; set; } 
    public virtual Employees Employee { get; set; } 
    public virtual IList<Products> Products { get; private set; } 

} 

직원 수 :

public class Employees 
{ 

    public virtual int EmployeeID { get; private set;} 
    public virtual string LastName { get; set;} 
    public virtual string FirstName { get; set;} 
    public virtual string City { get; set; } 
    public virtual DateTime HireDate { get; set; } 
    public virtual string Title { get; set; } 
    public virtual IList<Orders> Orders { get; private set; } 

} 

EmployeeOrderDTO :

public class EmployeeOrder 
{ 
    public virtual string EmployeeName { get; set; } 
    public virtual string EmployeeTitle { get; set; } 
    public virtual DateTime RequiredDate { get; set; } 
    public virtual List<Products> OrderedProducts { get; set; } 
} 

답변

2

변경

var list = (List<EmployeeOrder>)criteriaSelect.List<EmployeeOrder>(); 

그러나 당신이 미래에되고 싶은 경우 : 당신은 그냥 캐스트 할 수 있도록

criteriaSelect.List<EmployeeOrder>(); 

nHibernate 수 2.1에서
List<EmployeeOrder> employeeOrders = criteriaSelect.List<EmployeeOrder>() as List<EmployeeOrder>; 
4

때문에, .List() 메소드는 실제로 이미 목록 형식을 반환 안전하고 현재 nHibernate의 구현에 기반한 가정에 의존하지 않고, 나는 ICriteria를 받아들이는 확장 메소드를 쓸 것이다 :

public static List<T> ToList<T>(this ICriteria criteria) 
    { 
    return criteria.List<T>().ToList(); 
    }