NHibernateとOracleを使用して、私は条件付きで注文する際に問題に遭遇しています。 は、私はこれらのエンティティ(およびそれに対応するデータベースの種類を)持っていると言う:OracleのNHibernateキャスト文字列パラメータ
LINQのを使用して、私はこのようなクエリを実行できるような従来の方法でマッピングされ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
}
:
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がnullです。または私はstring.Empty、または "abc"にすることができます。文字列にかかわらず、パラメータ自体はvarchar2型ですが、COMPANY.NAMEはnvarchar2です。このOracle例外がスローされます:
ORA-12704:文字セットの不一致ORDERBYは、次のようになりますように、私は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 vs OrderByで同じ種類の問題のようです。異なるcase文のデータ型が一致しません。 – ZrSiO4