Tri avec la formule mathématique avec nHibernate (C #)
-
10-10-2019 - |
Question
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; }
}
Ma Feedback classe.
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>();
}
}
Mon étudiant de classe
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;
}
}
classe Mon cours
Je veux que les élèves de tri dans un cours avec la méthode SortBy: si le type est x je vais trier la règle suivante (Students.Feedback.Count) * 5 + Student.NumberOfStars)
Comment?
La solution 2
Requête avec LINQ
IList sortedStudents = (from student in this.Students
where student.Course == this
orderby (student.Feedbacks.Count*3 + student.NumberOfStars)
select student).ToList();
Autres conseils
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
est une fonction de HQL. Voir chapitre "Expressions" dans la documentation NH.
Vous pouvez également sélectionner des critères et trier avec LINQ.
Modifier
Je viens de voir que vous l'utilisez dans une propriété et vous peut les étudiants ont déjà en mémoire. Vous n'avez pas besoin d'une requête, juste de faire le tri.
return students
.OrderBy(x => x.Feedback.Count * 5 + x.NumberOfStars)
.ToList();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow