簡體   English   中英

如何將 SQL 聚合查詢轉換為 NHibernate 條件查詢

[英]How to convert SQL aggregate query into NHibernate Criteria Query

我是 NHibernate 中的標准 API 的新手。 有人可以使用 NHibernate 中的標准 API 生成這塊 SQL 嗎?

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
)

以及如何通過 NHibernate 中的標准 API 進行操作。 PS我不想使用HQL所以沒有HQL是否可以在nhibernate中生成這種sql?

您也可以使用 linq-2-nhibernate。

給定以下 class 結構:

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

這是您使用標准 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>();

使用 QueryOver API 它看起來像這樣:

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

此外,我認為您不需要在 SQL 查詢中加入 Department,因為您已經將 DepartmentId 作為 Student 表中的外鍵。 無緣無故地加入額外的桌子是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM