使用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);
在這種情況下,也許上面是愚蠢的,但我有多個情況下,我可能有一個條件排序依據。所以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,以便排序依據是這樣的,
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和OrderBy中的問題一樣。不同case語句中的數據類型不匹配。 – ZrSiO4