我正在将LINQ2SQL项目转换为使用NHibernate。我无法有效移植的一个查询是全文搜索。以前我使用存储过程来完成搜索,但现在我直接将其作为查询访问。 SQL查询是:
select a.id, a.parentID, a.text, a.summary
from articles a
inner join containstable(articles, (summary, text), :query) ar on
a.id = ar.[KEY]
order by ar.RANK desc
当我在SSMS中运行查询时,我得到了我期望的结果 - 只是articles
表的匹配项。但是,NHibernate似乎无法解释结果。我查询的代码是:
IQuery q = session.CreateSQLQuery(
"select a.id, a.parentID, a.[text], a.summary from articles a "
+ "inner join containstable(articles, (summary, text), :query) ar on "
+ "a.id = ar.[KEY] "
+ "order by ar.RANK desc")
.SetParameter<string>("query", query);
var results = q.List<article>();
NHibernate抛出一个错误System.Object[]
无法转换为我的POCO类型。我尝试了非泛型List()
方法,发现该列表中的每个项目都是一个对象数组。表上的其他查询工作正常,但这是唯一的SQL查询(其他一切都是Criteria或QueryOver)。为什么这个查询不起作用?
答案 0 :(得分:2)
您需要告诉NH这些行代表什么。
session.CreateSQLQuery(...)
.AddEntity(typeof(Article))
.SetParameter(...)
.List<Article>();
阅读Chapter 16. Native SQL了解更多详情
答案 1 :(得分:1)
如果您直接将查询作为SQL运行,那么即使表格已映射,NHibernate也不知道如何将其映射到您的POCO。您需要向NHibernate提供有关如何映射SQL投影的一些信息。
如果这是一个对您开放的选项,请使用HQL或LinqToNHibernate。