2009-04-28 10 views
2

Je ne suis pas familier avec la projection NHibernate. J'essaye de l'employer ainsi je peux renvoyer une liste <> plutôt qu'un IList <>. Je n'ai pas beaucoup de chance avec la projection au DTO pour le moment. J'ai la requête et les objets de domaine suivants. Donc, pour commencer, j'essaie juste d'obtenir une liste d'Ordres avec un EmployeeID. Je parcours la liste résultante et l'ajoute à une liste parce que je souhaite pouvoir sérialiser cette liste. Quelqu'un peut-il me dire jusqu'où je suis avec la projection? J'ai cherché et trouvé des exemples qui ne sont pas similaires aux miens. Fondamentalement .. Je veux juste créer une liste des DTO.NHibernate Projection to DTO

Merci!

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; 
    } 

Commandes:

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; } 

} 

employés:

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; } 
} 

Répondre

2

changement

criteriaSelect.List<EmployeeOrder>(); 

à

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

Dans NHibernate 2.1, la méthode .list() retourne en fait déjà un type de liste, de sorte que vous pouvez simplement jeter:

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

Cependant, si vous voulez être l'avenir sûr et ne dépend pas des hypothèses basées sur la mise en œuvre de l'actuel nHibernate, j'écrirais une méthode d'extension acceptant ICriteria:

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