我正在开发一个使用 nHibernate (v 3.3.2) 流畅的项目,其中所有现有查询都是一些 IQueryOver 与 Linq 之类的东西......
我想我可以通过使用存储过程来避免学习那种令人困惑的语法。但事实证明,打电话给他们非常困难。
我尝试了CreateSqlQuery,但得到了 GenericADOException“无法执行查询”。我尝试定义一个 .hbm.xml 文件并将其加载到:
m.HbmMappings.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly());
然后:
IQuery query = session.GetNamedQuery("sp_GetTagCount");
但未找到命名查询。我认为可能没有加载 XMLfile。
<?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 属性,但是我如何分组呢?