2009-04-28 75 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(); 
    }