NHibernate Проекция для DTO - PullRequest
       26

NHibernate Проекция для DTO

2 голосов
/ 28 апреля 2009

Я незнаком с проекцией NHibernate. Я пытаюсь использовать его, чтобы вернуть List <>, а не IList <>. Мне пока не очень повезло с проектированием в DTO. У меня есть следующий запрос и объекты домена. Итак, для начала я просто пытаюсь получить список заказов с заданным EmployeeID. Я перебираю полученный список и добавляю его в список, потому что хочу иметь возможность сериализации этого списка. Может кто-нибудь сказать мне, как далеко я с проекцией? Я искал и нашел несколько примеров, которые не похожи на мои собственные. В основном ... Я просто хочу создать список 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 ]

4 голосов
/ 28 сентября 2009

В 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 голосов
/ 28 апреля 2009

Изменение

criteriaSelect.List<EmployeeOrder>();

до

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