NHibernate 投影到 DTO
Posted
技术标签:
【中文标题】NHibernate 投影到 DTO【英文标题】:NHibernate Projection to DTO 【发布时间】:2009-04-28 03:08:34 【问题描述】:我不熟悉 NHibernate 投影。我正在尝试使用它,以便可以返回 List 而不是 IList。到目前为止,我在向 DTO 投射方面还没有多少运气。我有以下查询和域对象。所以一开始我只是想得到一个给定 EmployeeID 的订单列表。我正在遍历结果列表并将其添加到列表中,因为我希望能够序列化此列表。谁能告诉我Projection离我有多远?我搜索并发现了一些与我自己不相似的示例。基本上.. 我只想创建一个 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;
【问题讨论】:
【参考方案1】:在 nHibernate 2.1 中,.List() 方法实际上已经返回一个 List 类型,所以你可以直接转换:
var list = (List<EmployeeOrder>)criteriaSelect.List<EmployeeOrder>();
但是,如果您希望未来安全并且不依赖于基于当前 nHibernate 实现的假设,我会编写一个接受 ICriteria 的扩展方法:
public static List<T> ToList<T>(this ICriteria criteria)
return criteria.List<T>().ToList();
【讨论】:
【参考方案2】:改变
criteriaSelect.List<EmployeeOrder>();
到
List<EmployeeOrder> employeeOrders = criteriaSelect.List<EmployeeOrder>() as List<EmployeeOrder>;
【讨论】:
以上是关于NHibernate 投影到 DTO的主要内容,如果未能解决你的问题,请参考以下文章
nHibernate标准ResultTransformer不工作
Fluent Nhibernate ApplyFilter on Join 列