質問: sess.Query().Select("new (Id, Login, (long?)Person.Id as PersonId)"); ``` 選択式が動的に生成されるためです。残念ながら、動的LINQは(long?)へのキャストを理解できません:( 私は何をしなければなりませんか?前もって感謝します! **====編集====** さて、私は2つのことを理解しました:1.動的LINQはInt64だけを認識し、長いことは認識しません。 2.キャストは「(Int64)something」ではなく「Int64(something)」です。だから私のコード全体は ``` sess.Query().Select("new (Id, Login, Int64?(Person.Id) as PersonId)"); ``` しかし、NHibernateが「クエリを実行できませんでした[SQL:SQLを使用できません]」例外とNullReference内部例外で失敗するため、問題はまだ解決しません。
回答: 最後に私は問題をマスターしました。 Dynamic.csを調べたところ、Dynamic LINQの構文は非常に特殊であることがわかりました。特に、文字列式 "SomeType(SomeExpression)"は、SomeTypeに1つのパラメーターを持つコンストラクターがない場合にのみキャスト式を生成します。それ以外の場合は、「新しいSomeType(SomeExpression)」を生成します。私はそれを間違いだと考え、Dynamic.csを少し変更しました。 今私の例では、キャストは 'Int64? Person.Id '。これは「通常の」キャスト構文ではありませんが、私には魅力のように機能します。 Dynamic ExpressionParserは非常に優れていますが、残念ながらC#キャスト構文にはあまり適していません。 また、 "long"、 "int"などの短い型名をDynamic.csに登録しました。 変更されたソースはhttp://1drv.ms/1cRJtSPからダウンロードできます 。