2016-11-08 6 views
1

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内でデフォルト文字列の文字セットを設定しますか?

ありがとう

+0

[C#??演算子とora-12704:文字セットの不一致](http://stackoverflow.com/questions/28082826/c-sharp-operator-and-ora-12704-character-set-mismatch) –

+0

@ shA.tそうですそれはSelect vs OrderByで同じ種類の問題のようです。異なるcase文のデータ型が一致しません。 – ZrSiO4

答えて

0

その特定のプロパティのマッピングでAnsiStringを使用します。あなたはこれらの鋳物を持っていないでしょう。

+0

この奇妙な変わり方に合わせてデータベースを変更する必要があるため、少し後ろに見えます。従来の目的のためにプラス私はデータベースをそのままにしておく必要があります。 – ZrSiO4

+0

私はあなたがデータベースを変更する必要があるとは言いませんでした。マッピングを変更するだけです。 –

関連する問題