Как преобразовать агрегатный запрос SQL в запрос критериев NHibernate - PullRequest
0 голосов
/ 12 июля 2011

Я новичок в Criteria API в NHibernate. Может кто-нибудь сгенерировать этот кусок SQL, используя Criteria API в NHibernate?

select count(*) 
from result where Student_id 
in(
  SELECT s.Student_id 
  from Department as d
  JOIN Student s ON d.Dept_id=s.Dept_id
  where d.Dept_id=2
)

и как пройти через Criteria API в NHibernate. P.S Я не хочу использовать HQL, поэтому без HQL возможно генерировать этот тип SQL в nhibernate?

Вы также можете использовать linq-2-nhibernate.

1 Ответ

3 голосов
/ 12 июля 2011

Учитывая следующую структуру классов:

public class Result{
    public virtual Student Student {get; set;}
}

public class Student{
    public virtual Department Department {get; set;}
    public virtual int Id { get; set;}
}

public virtual Department {
    public virtual int Id {get; set;}
    public virtual IList<Student> Students {get; set;}
} 

Вот ваш запрос с использованием Criteria API:

var studentidquery = DetachedCriteria.For<Student>()
  .Add(Restrictions.Eq("Department.Id"),2)
  .SetProjection(Projections.Property("Id"));

var count = session.CreateCriteria<Result>()
   .Add(Subqueries.PropertyIn("StudentId", studentidquery))
   .UniqueResult<int>();

При использовании API QueryOver это будет выглядеть так:

var studentidquery = QueryOver.Of<Student>()
  .Where(x=>x.Department.Id==2)
  .Select(x=>x.Id);

var count = session.QueryOver<Result>()
   .WithSubquery.WhereProperty(x => x.Id).In(studentidquery)
   .Select(Projections.Count<Result>(r=>r.Id))
   .UniqueResult<int>();

Кроме того, я не думаю, что вам нужно соединение с Department в вашем SQL-запросе, поскольку у вас уже есть DepartmentId в качестве внешнего ключа в таблице Student.Нет смысла присоединяться к дополнительным таблицам без уважительной причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...