nHibernate查询语法

时间:2013-09-18 01:26:15

标签: sql nhibernate stored-procedures fluent-nhibernate

我正在开发一个使用nHibernate(v 3.3.2)并且流畅的项目,其中所有现有查询都是一些类似于Linq的IQueryOver ......

我认为通过使用存储过程可以避免学习混乱的语法。但事实证明,召唤它们非常困难。

我试过CreateSqlQuery但是得到了GenericADOException“无法执行查询”。我尝试定义.hbm.xml文件并将其加载到:

m.HbmMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());

然后:

IQuery query = session.GetNamedQuery("sp_GetTagCount");

但未找到命名查询。我想也许没有加载XML文件。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <sql-query name="sp_GetTagCount"  callable="true" >
    <return class="TagCount" />

    exec sp_GetTagCount
  </sql-query>
</hibernate-mapping>

这是我添加到应用程序的唯一XML或配置,因此可能需要更多配置。

我很乐意使用流畅的查询而不是sproc,但我唯一需要复制的是单表选择。

SQL非常简单:

SELECT TOP 10
    t.[Id], t.[Name], count(*) as [Count]
FROM [dbo].[Tag] t inner join 
     [dbo].[TagEntry] te on t.Id = te.TagId
GROUP BY t.[Id], t.[Name]
ORDER BY [Count] DESC

我只需要任何方式将此查询转换为nHibernate。我在“nhibernate流畅教程”上尝试了很多谷歌搜索,但他们似乎只讨论了数据库配置和类配置。我需要学习这种查询语法。我花了很多时间在这上面,似乎没有取得任何进展。

如果有人可以指导我使用优秀的初学者教程来复制联接,请使用这种流畅的查询语法进行分组和聚合,这将非常棒!

我根据Oskar的建议使用Nhibernate.Linq取得了一些进展。

我写的是这样的:

var results = (from t in session.Query<Tag>()
             join e in session.Query<TagEntry>()

但是模型中不存在TagEntry。

HasManyToMany(x => x.Entries)
                .Table("TagEntry")
                .ParentKeyColumn("TagId")
                .ChildKeyColumn("EntryId")
                .Inverse()
                .LazyLoad();

每个标签都有一个Entries属性,但这个属性很好但我该如何分组?

1 个答案:

答案 0 :(得分:1)

您可以使用Linq但不需要连接我认为nHibernate会自动为您执行该操作,因此只需计算Entries属性:

var results = (from t in Session.Query<Tag>()
    select new { Id = t.Id, TagUseCount = t.Entries.Count(), TagName = t.Name });