2009-04-28 119 views
2

我不熟悉NHibernate投影。我正在嘗試使用它,因此我可以返回列表<>而不是IList <>。到目前爲止,我還沒有多少投入DTO的運氣。我有以下查詢和域對象。所以開始我只是想給出一個EmployeeID的訂單列表。我正在遍歷結果列表並將其添加到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

變化

criteriaSelect.List<EmployeeOrder>(); 

List<EmployeeOrder> employeeOrders = criteriaSelect.List<EmployeeOrder>() as List<EmployeeOrder>; 
4

NHibernate的2.1,回到.list()方法實際上已經返回一個列表類型,所以你可以只投:

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

但是,如果你想成爲未來安全,不依賴於基於當前nHibernate的實現的假設,我會寫一個接受ICriteria的擴展方法:

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