2011-01-13 5 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; } 
} 

私のフィードバッククラス。タイプがXIある場合 次のルール (Students.Feedbackでソートされます:私はメソッドSORTBYとコースに学生を並べ替えたい私の学生のクラスnHibernate(C#)で数式をソートする

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

} 

マイコースクラス

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

.Count)* 5 + Student.NumberOfStars)

どのようにですか? LINQ

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

基準にする必要がありますか? HQLでははるかに簡単です。 –

+0

HQLとCriteriaの両方で記述できますか? – gandil

+0

もちろん、クエリごとに必要なものを使用できます。動的クエリが必要な場合を除き、私はHQLを好んでいます(これは、構造が実行時に定義されている場合を意味します)。 –

答えて

1

問合せ:

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はHQL関数です。 NHのドキュメントのchapter "Expressions"を参照してください。

また、Criteriaを選択してLinqでソートすることもできます。

編集

はちょうどあなたがプロパティにそれを使用することを見て、あなたは、メモリ内に既に学生であってもよいです。 クエリを必要とせず、並べ替えるだけです。

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

これはHQLではなくLinqです。 –

+0

ところで、これはあなたのエンティティに既にある学生に依存します。これをはるかに簡単に書くことができ、クエリを必要としません。 –

3

HQLと

関連する問題