【问题标题】:nHibernate query syntaxnHibernate 查询语法
【发布时间】:2013-09-18 01:26:15
【问题描述】:

我正在开发一个使用 nHibernate (v 3.3.2) 和 fluent 的项目,其中所有现有查询都是一些 IQueryOver 和 Linq 之类的东西......

我认为我可以通过使用存储过程来避免学习那种令人困惑的语法。但事实证明,给他们打电话非常困难。

我尝试了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 或配置,因此可能需要更多配置。

我很乐意使用流利的查询而不是存储过程,但我唯一需要复制的是单表选择。

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 fluent tutorial”上尝试了无数次谷歌搜索,但他们似乎只讨论了数据库配置和类配置。我需要学习这个查询语法。我在这方面花了很多时间,但似乎没有取得任何进展。

如果有人能指导我学习一个很好的初学者教程,以这种流畅的查询语法复制连接、分组和聚合,那就太好了!

按照 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 属性,但我如何分组?

【问题讨论】:

  • 对于一个好的资源(虽然旧)是Summer of nhibernate以及NHibernate Cookbook
  • 您没有说明 NHibernate 的版本,但最近的版本对实际的 LINQ 也有很好的支持。
  • 版本为 3.32。使用 linq 会很好,它与 SQL 足够相似。是否可以使用 nHibernate 运行任意 SQL 而不必回退到 XML 配置?

标签: sql nhibernate stored-procedures fluent-nhibernate


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多