Я реализую полнотекстовый поиск с использованием представления vw_SearchSite, в котором есть все доступные для поиска поля и возвращающие сайты, идентификаторы сайтов которых совпадают с результатами поиска.
запрос:
.....
<return alias="site" class="Site"/>
SELECT DISTINCT {site.*}
FROM v_Site {site}
WHERE {site}.Id IN (
SELECT Id
FROM vw_SearchSite
WHERE CONTAINS(vw_SearchSite.*,:pattern)
)
реализация:
public Site[] GetSitesforSearch(string search)
{
using (var session = GetSession())
{
var q1 = session.GetNamedQuery("SearchSite").SetString("pattern", search);
var q2 = q1.List<Site>().ToArray();
return q2;
}
}
исключение при модульном тестировании:
in expected: {site} [SELECT DISTINCT {site.*}
FROM v_Site {site}
WHERE {site}.Id IN (
SELECT Id
FROM vw_SearchSite
WHERE CONTAINS(vw_SearchSite.*,:pattern)
)]
У меня есть полные права доступа к базе данных localhost. Я перепробовал все возможные перестановки и комбинации с приведенным выше кодом и не нашел выхода. запрос работает абсолютно нормально, когда я выполнил его в студии управления SQL SERVER.
Это мой модульный тест:
public void Getsitesforsearch_returns_all_matching_sites_test () {// Упорядочить const string search = "abc"; var country = _entityBuilder.CreateCountry (); country.Name = "стена страны"; var country1 = _entityBuilder.CreateCountry (); country.Name = "дрянная страна"; var state1 = _entityBuilder.CreateState (); state1.Country = страна; var state2 = _entityBuilder.CreateState (); state2.Country = country1; state1.Name = "состояние стены"; state1.Abbreviation = "WS"; state2.Name = "хрень"; state2.Abbreviation = "CR";
var site1 = _entityBuilder.CreateSite();
var site2 = _entityBuilder.CreateSite();
var site3 = _entityBuilder.CreateSite();
var site4 = _entityBuilder.CreateSite();
site1.Name = "abc";
site1.City = "wallsite";
site1.PostalCode = "33333";
site1.State = state2;
site2.State = state2;
site2.City = "wallsite";
site2.PostalCode = "44444";
site2.Name = "site wall";
site3.State = state1;
site3.City = "wallsite";
site3.PostalCode = "55555";
site3.Name = "site";
site4.City = "walstreet";
site4.PostalCode = "66666";
site4.Name = "site wall";
site4.State = state2;
PersistEntities(state1, state2, country1,country);
PersistEntities(site1,site2,site3,site4);
var sites = new[] {site2,site3,site4};
//Act
var repository = CreateRepository();
var result = repository.GetSitesforSearch(search);
//Assert
result.ShouldNotContain(site1);
result.ShouldEqual(sites) ;
result.ShouldContain(site2);
result.ShouldContain(site3);
result.ShouldContain(site4);
}
Это ошибка:
SiteRepositoryTester.Getsitesforsearch_returns_all_matching_sites_test: сбой
NHibernate: ВЫБЕРИТЕ DISTINCT site.Id как Id10_0_, site.Name как Name10_0_, site.Address as Address10_0_, site.City как City10_0_, site.PostalCode как PostalCode10_0_, site.Latitude как Latitude10_0_, site.LongitudeNamePrim PrimaryG8_10_0_, site.SecondaryGroupName как Secondar9_10_0_, site.StateId как StateId10_0_ FROM v_Site site WHERE site.Id IN (SELECT Id FROM vw_SearchSite WHERE CONTAINS (vw_SearchSite. *, @ P0)); @ p0 = 'abc'
System.Data.SqlClient.SqlException: недопустимое имя объекта "v_Site".
в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParserbject.Throwning .Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.DataDataConslader (System.DataCatalader) в System.DataCatalader (System.DataConslader) в System.DataCatalader (System.DataCatalader) в System.DataCatalader (System.DataCatalader) (в System.DataCatalader) (в System.DataCatalader) (в System.DataCatalader) (в System.DataCatalader) в System.DataCatalader (System.DataConslader) (в System.DataCatalader) (в System.DataCatalader) (в System.DataCatalader) (в System.DataConslader) (в System.DataCatalader) в System.DataCatalader (System.DataCatalader) .Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior в cmdBehavior. RunExecuteReader (CommandBehavior, cmdBehavior, RunBehavior, runBehavior, Boolean returnStream, String meth od, результат DbAsyncResult) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, метод String) в System.Data.SqlClient.SqlCommand.Executehavior метод, поведение System.Data.SqlClient.SqlCommand.Executehavior SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader () в NHibernate.AdoNet.AbstractBatcher.ExecuteReader (IDbCommandSmdLoader.StandRoader.Cdmand (IDbCommand). , Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) в NHibernate.Loader.Loader.DoQuery (ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) в NHibernate.Loader.Loader.DoQuessionAndrameterLoaderSessionParameters, queryParameters (sessionParameters), сеансе NHibernate.Loader.Loader.DoList (сеанс ISessionImplementor, QueryParameters queryParamet ers)
NHibernate.ADOException: не удалось выполнить запрос [ВЫБЕРИТЕ DISTINCT site.Id как Id10_0_, site.Name как Name10_0_, site.Address как Address10_0_, site.City как City10_0_, site.PostalCode как PostalCode10_0_, site. Широта как Latitude10_0_, site.Longitude как Longitude10_0_, site.PrimaryGroupName как PrimaryG8_10_0_, site.SecondaryGroupName как Secondar9_10_0_, site.StateId как StateId10_0_ FROM v_Site site WHERE site.Id CON_ WHERE site. ))] Имя: шаблон - Значение: abc [SQL: ВЫБРАТЬ DISTINCT site.Id как Id10_0_, site.Name как Name10_0_, site.Address как Address10_0_, site.City как City10_0_, site.PostalCode как почтовый код10_0_, site.Latitude как Latitude10_0_ , site.Longitude как Longitude10_0_, site.PrimaryGroupName как PrimaryG8_10_0_, site.SecondaryGroupName как Secondar9_10_0_, site.StateId как StateId10_0_ ОТ v_Site site ГДЕ site.Id IN (ВЫБЕРИТЕ ИД ИЗ vw_SearchSite AINS (vw_SearchSite.,?))]
в NHibernate.Loader.Loader.DoList (сеанс ISessionImplementor, QueryParameters queryParameters) в NHibernate.Loader.Loader.ListIgnoreQueryCache (сеанс ISessionImplementor, QueryParameters queryParameters) в NHibernate.Loader.Loader. IType [] resultTypes) в NHibernate.Loader.Custom.CustomLoader.List (сеанс ISessionImplementor, QueryParameters queryParameters) в NHibernate.Impl.SessionImpl.ListCustomQuery (ICustomQuery customQuery, QueryParameters queryParameters, IListnateImplery results (Nhibernate). spec, QueryParameters queryParameters, результаты IList) в NHibernate.Impl.SessionImpl.List (спецификация NativeSQLQuerySpecification, QueryParameters queryParameters) в NHibernate.Impl.SqlQueryImpl.List () в Toro.TurfGuard.Common.Infrastructureear.SiteReccess.Impl Строковый поиск) в SiteRepository.cs: строка 33 в Toro.TurfGuard.Common.Integrat ionTests.Infrastructure.DataAccess.Impl.SiteRepositoryTester.Getsitesforsearch_returns_all_matching_sites_test () в SiteRepositoryTester.cs: строка 109
Итак, может ли кто-нибудь помочь мне с обработкой этих исключений. немедленная помощь приветствуется.
Правильно ли указано имя таблицы
<return alias="site" class="Site"/>
SELECT DISTINCT {site.*}
FROM v_Site {site}
WHERE {site}.Id IN (
SELECT Id
FROM vw_SearchSite
WHERE CONTAINS(vw_SearchSite.*,:pattern)
)
?
Не похоже, что вы включили всю ошибку. Не могли бы вы включить полное сообщение вместе с трассировкой стека?