如何使用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; }
}
答案 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)能够在没有问题的情况下重命名字符串,绑定或任何类型的文件中的标识符。