Использование NHibernate и Oracle, я столкнулся с проблемой при заказе условного кода. Скажем, у меня есть эти объекты (и их соответствующие типы баз данных):Параметры строковой строки NHibernate в Oracle
public class Contact
{
public virtual int PrimaryKey { get; set; } // number(38,0) NOT NULL
public virtual string Name { get; set; } // nvarchar2(max) NULL
public virtual int? CompanyFk { get; set; } // number(38,0) NULL
public virtual Company Company { get; set; }
}
public class Company
{
public virtual int PrimaryKey { get; set; } // number(38,0) NOT NULL
public virtual string Name { get; set; } // nvarchar2(max) NULL
}
Подключенные обычным способом, например, что с помощью Linq, я могу запросить так:
var boeingEmployees = Context.Contacts.Where(c => c.Company.Name == "Boeing");
Проблема начинается, если Я делаю что-то вроде этого:
var query = Context.Contacts.OrderBy(c => c.Company == null ? null : c.Company.Name);
В этом контексте, может быть выше, это глупо, но у меня есть несколько случаев, когда я могу иметь условный OrderBy. Так что NHibernate переводит это примерно так:
SELECT CONTACT.PRIMARYKEY, CONTACT.NAME, CONTACT.COMPANYFK
FROM CONTACT
LEFT OUTER JOIN COMPANY ON CONTACT.COMPANYFK = COMPANY.PRIMARYKEY
ORDER BY CAST(CASE WHEN CONTACT.COMPANYFK IS NULL THEN :p0 ELSE COMPANY.NAME END AS NVARCHAR(255)) ASC;
с параметром p0, равным нулю. Или я могу сделать его string.Empty, или "abc". Независимо от строки, сам параметр имеет тип varchar2, тогда как COMPANY.NAME - nvarchar2. Это исключение Oracle брошено:
ORA-12704: набор символов несовпадение
Если я возиться с SQL, так что OrderBy выглядит так,
ORDER BY CASE WHEN CONTACT.COMPANYFK IS NULL THEN CAST(:p0 AS NVARCHAR2(255)) ELSE COMPANY.NAME END ASC
, то этот запрос работает отлично. Но, очевидно, это сгенерированный NHibernate код, который я не могу (я думаю) действительно изменить его на практике.
Итак, вопрос для тех немногих, кто работает с NHibernate и Oracle ... Каков наилучший способ справиться с этим? Есть ли способ передать параметр? Или задать строковый символ по умолчанию в NHibernate?
Благодаря
Возможный дубликат [C# ?? оператор и ora-12704: несоответствие набора символов] (http://stackoverflow.com/questions/28082826/c-sharp-operator-and-ora-12704-character-set-mismatch) –
@ shA.t да, он выглядит как и в том же виде, в Select vs OrderBy. Типы данных в разных случаях не совпадают. – ZrSiO4