2011-01-13 9 views
0
public class Feedback 
{ 
public virtual int Id { get; private set; }  
public virtual string ContentText { get; set; } 
public virtual DateTime FeedbackDate { get; set; } 
public virtual Student student { get; set; } 
} 

Meine Feedback-Klasse.Sortieren mit mathematischer Formel mit nHibernate (C#)

public class Student 
{ 
public virtual int Id { get; private set; }  
public virtual int NumberOfStars { get; set; } 
public virtual IList<Feedback> Feedbacks { get; private set; } 

public Student() 
{ 
    Feedback = new List<Feedbacks>(); 
} 
} 

Mein Student Class

public class Course 
{ 
public virtual int Id { get; set; } 
    // bla bla bla 
public virtual IList<Student> Students { get; private set; } 

public Course() 
{ 
    Students = new List<Student>(); 
} 

public IList<Student> SortBy(string type) 
{ 
    // some other sorting 
    else if (type.Equals("popular")){ 
    sortedStudents = session.CreateCriteria(typeof(Student)) 
    .CreateAlias("Student", "s") 
    .CreateAlias("s.Feedback", "f") 
    .AddOrder(Order.Desc(--------)) 
    .List(); 
    } 

    return (IList<Student>) sortedStudents; 
} 

} 

Mys Course Klasse

Ich mag Studenten in einem Kurs mit Methode SortBy sortieren: wenn Typ xi mit folgenden Regel (Students.Feedback wird sortieren ist .Count) * 5 + Student.NumberOfStars)

Wie?

+0

Muss es Kriterien sein? Es ist viel einfacher in HQL. –

+0

Können Sie sowohl in HQL als auch in Kriterien schreiben? – gandil

+0

Sicher, Sie können für jede Abfrage verwenden, was Sie wollen. Ich würde HQL bevorzugen, es sei denn, Sie benötigen dynamische Abfragen (das heißt: wenn die Struktur zur Laufzeit definiert ist). –

Antwort

1

Abfrage mit LINQ

IList sortedStudents = (from student in this.Students 
         where student.Course == this 
         orderby (student.Feedbacks.Count*3 + student.NumberOfStars) 
         select student).ToList(); 
+1

Dies ist nicht HQL, das ist Linq. –

+0

Das hängt übrigens von den Schülern ab, die Sie bereits in Ihrem Unternehmen haben. Sie könnten dies viel einfacher schreiben und Sie brauchen keine Abfrage dafür. –

3

HQL:

List<Student> sortedStudents = session 
    .CreateQuery(
    @"from Students student 
     where student.Course == :course 
     order by size(student.Feedbacks) * 3 + student.NumberOfStars") 
    .SetEntity("course", course) 
    .List<Student>(); 

size ist eine Funktion HQL. Siehe chapter "Expressions" in der NH-Dokumentation.

Sie können es auch mit Kriterien auswählen und es mit Linq sortieren.

bearbeiten

Gerade gesehen, dass Sie es in einer Eigenschaft verwenden, und Sie können haben die Schüler bereits im Speicher. Sie brauchen keine Abfrage, nur um sie zu sortieren.

return students 
    .OrderBy(x => x.Feedback.Count * 5 + x.NumberOfStars) 
    .ToList(); 
Verwandte Themen