2009-04-28 6 views
2

Ich bin nicht vertraut mit NHibernate Projektion. Ich versuche, es zu verwenden, so kann ich eine Liste <> eher, dass ein IList <> zurückgeben. Ich habe noch nicht viel Glück mit der Projektion in den DTO. Ich habe die folgenden Abfrage- und Domänenobjekte. Um zu beginnen, versuche ich nur, eine Liste der Aufträge zu erhalten, die eine EmployeeID erhalten. Ich durchlaufe die resultierende Liste und füge sie zu einer Liste hinzu, weil ich diese Liste serialisieren möchte. Kann mir jemand sagen, wie weit ich von der Projektion entfernt bin? Ich habe einige Beispiele gesucht und gefunden, die nicht meinen eigenen ähneln. Grundsätzlich .. Ich möchte nur eine Liste der DTOs erstellen.NHibernate Projektion zu DTO

Danke!

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

Aufträge:

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

} 

Mitarbeiter:

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

Antwort

2

ändern

criteriaSelect.List<EmployeeOrder>(); 

zu

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

In nHibernate 2.1, die .List() Methode gibt tatsächlich bereits eine Liste Typ, so dass Sie nur werfen kann:

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

Wenn Sie jedoch Zukunft sein wollen sicher und nicht von Annahmen auf der Grundlage der Implementierung des aktuellen nHibernate abhängen, würde ich eine Erweiterungsmethode schreiben, die ICriteria akzeptiert:

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