NHibernate не может использовать результаты запроса containstable () - PullRequest
1 голос
/ 24 июля 2011

Я в процессе преобразования проекта 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). Почему этот запрос не работает?

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Вы должны сообщить NH, что представляют собой эти строки.

session.CreateSQLQuery(...)
       .AddEntity(typeof(Article))
       .SetParameter(...)
       .List<Article>();

Читать Глава 16. Собственный SQL для более подробной информации

1 голос
/ 24 июля 2011

Если вы выполняете запрос напрямую как SQL, тогда NHibernate не будет знать, как сопоставить его с вашими POCO, даже если таблицы сопоставлены.Вам необходимо предоставить NHibernate некоторую информацию о том, как должна отображаться проекция SQL.

Используйте HQL или LinqToNHibernate, если этот вариант открыт для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...