2010-12-04 140 views
2

我怎样才能做到这一点查询与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的新手,所以这个问题可能很简单。

这里有一些更多的信息

我用流利的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; } 
} 

回答

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)能够在字符串,绑定或任何类型的文件中重命名标识符而不会出现问题。

+1

这不是我所说的“强类型”,因为它是一个普通的旧字符串。如果表“Class”被重命名,那么没有任何东西阻止应用程序编译。但我认为(还没有尝试过)它正在做我想做的事。在接受这个答案之前,我会等待一些可能的选择。 – W3Max 2010-12-04 04:28:02

相关问题