如何使用NHibernate进行此查询

时间:2010-12-04 02:57:45

标签: sql nhibernate

如何使用NHibernate进行此查询

select top 10 count(distinct classedition.createdby_id) as editions, class.id,
       class.name, class.createdon, class.createdby_id
from class 
inner join classedition on class.id = classedition.class_id
group by class.id, class.name, class.createdon, class.createdby_id
order by editions desc, class.createdon desc

我正在使用NHibernate 3. 我尝试使用新的Linq提供程序,但没有成功。我不关心这样做的方式,只要它产生上面的确切的sql查询。我更喜欢编写强类型查询,如果可能的话没有魔术字符串。

我是NHibernate的新手,所以这个问题可能很简单。

以下是更多信息

我使用Fluent NHibernate和AutoMappings。 C#类非常简单:

public  class Class
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime CreatedOn { get; set; }
}

public class ClassEdition
{
    public virtual int Id { get; set; }
    public virtual Class Class { get; set; }
    public virtual User CreatedBy { get; set; }
}

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

2 个答案:

答案 0 :(得分:1)

我最终通过使用View来解决问题。

我不想变得粗鲁,但似乎NHibernate社区更倾向于在我提出问题的方式上争论,然后回答问题本身。请参阅Diego Mijelshon的回答评论。我在nhusers(Google网上论坛)上收到了同样的指责(关于使用单元测试):http://groups.google.com/group/nhusers/browse_thread/thread/4c74269aefb918fc

答案 1 :(得分:0)

HQL查询是强类型和面向对象的。

var results = session.CreateQuery(@"
              select count(distinct e.CreatedBy), c.Id,
                     c.Name, c.CreatedOn, c.CreatedBy
              from ClassEditions e
              join e.Class c
              group by c.Id, c.Name, c.CreatedOn, c.CreatedBy
              order by 1 desc, c.CreatedOn desc
              ")
              .SetMaxResults(10)
              .List();

您的C#代码也是一个字符串。 NH还有一个查询编译器。

事实上,如果您将查询放在映射文件中,您甚至可以通过安装HQL Language Service for Visual Studio来进行智能感知和实时错误检查。

一个简单的单元测试除了构建SessionFactory之外什么都不会告诉你是否有任何因为更改而破坏。更不用说现代重构工具(如Resharper)能够在没有问题的情况下重命名字符串,绑定或任何类型的文件中的标识符。