2010-09-03 2 views
1

У меня есть запрос, который имеет предложение Order By. Сгенерированный SQL из NHibernate выглядитПредотвращение NHibernate из сглаживания в ORDER BY

ORDER BY coalesce(x.Company as x__.Company, y.Company) asc 

Это терпит неудачу как «как» не допускается в Приказе пунктом в MS SQL Server. Есть ли способ предотвратить наложение псевдонимов?

Критерии запроса, который я написал выглядит следующим образом:

var orderBy = Projections.SqlFunction("coalesce", NHibernateUtil.String,  
         Projections.ProjectionList() 
         .Add(Projections.Property("x.Company")) 
         .Add(Projections.Property("y.Company"))); 

var order = Order.Asc(orderBy); 
criteria.AddOrder(order); 

ответ

2
Projections.SqlFunction("coalesce", 
         NHibernateUtil.String, 
         Projections.Property("x.Company"), 
         Projections.Property("y.Company")); 

Параметры к COALESCE (или любой другой) функции должны быть переданы по отдельности (на самом деле, как массив Params), а не объединены в ProjectionList.

+0

Спасибо Диего! Это помогло. Меня это поразило. – WorldIsRound

+0

Привет, У меня есть аналогичная проблема. Но вместо этого я добавляю столбцы условной сортировки в список прогнозов и в последнем случае предоставляю Orderby(), где получаю эту «AS», нарушающую SQL. Мне нужно иметь сортировку по столбцам, используя множество условий. Есть идеи? – Ammad

0

У меня были подобные досадные проблемы. Возможно, вам придется вывести класс из PropertyProjection и использовать его на месте Projections.Property(). Переопределите метод ToSqlString и разделите предложение AS.

+0

Tim, Что должно быть отменено? я пытался что-то вроде: общественного отменяют SqlString ToSqlString (критерии ICriteria, INT LOC, ICriteriaQuery criteriaQuery, IDictionary <строковых IFilter> enabledFilters) { вернуть новый SqlString (this.PropertyName); } Но это бросил исключение: System.ArgumentException был необработанное кодом пользователя Message = длина должна быть больше или равна 0 – WorldIsRound

+0

Или уж на то пошло, в переопределение я предоставил возвратный новый SqlString (новая строка [] {this.PropertyName}); Я получил то же самое ArgumentException – WorldIsRound

Смежные вопросы