2012-01-27 9 views
1

私はこれに夢中になり、助けに感謝します。Linq Nhibernate:外部キーテーブルから値を引き出すことができません

フォント FontColors私はFontColorsは、フォントテーブルの情報を報告し、コンピュータが同様に含ま取得する必要があります

は、外部キーに接続された2つのテーブルを想像してみてください。エンティティフレームワークを介して、私は明らかにフォント色 "フォント"テーブルプロパティに次のようにアクセスできます:

文字列fontName = FontColors.Fonts.Name;

シンプル...右ですか?

ここでは、InfoFullColorsという別のクラスを作成して、たとえば、私が表示するレポートモデル(Jquery Gridレポート)と一致するように、同じフォントとFontColors情報私のコンピュータの説明テーブル。

var computerFonts = from f in FontColors 
       select new ComputerFontColors 
{ 
    FontColor = f.Color, 
    FontName = f.Fonts.Name, 
    ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id) 
} 

はそれを得ることができるほど単純であるように思わが、何らかの理由でそれがうまく動作しないために:だからComputerFontColorsクラスは、我々はこのようなもので行くことに移入する

。 Nhibernate Linqは "ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id)"の部分を好まず、 "Could not instantiate:FontFolors"というエラーを返すだけです。

メソッド ComputerServices.GetByFontId(f.Fonts.Id) それ自身で正常に動作します。

でスロー静的な値を持つクエリ:

var computerFonts = from f in FontColors 
       select new ComputerFontColors 
{ 
    FontColor = f.Color, 
    FontName = f.Fonts.Name, 
    ComputerUsedOn = ComputerServices.GetByFontId(6) 
} 

が正常に動作します。

しかし、それらを組み合わせると、コードがクラッシュします。 これに貼り付けられました。

ありがとうございます。

答えて

1

キックについては、これを試してください。

var computerFonts = FontColors.AsEnumerable().Select(f => 
new ComputerFontColors 
{ 
    FontColor = f.Color, 
    FontName = f.Fonts.Name, 
    ComputerUsedOn = ComputerServices.GetByFontId(f.Fonts.Id) 
}); 

AsEnumerableは、メモリ内のオブジェクトメソッドに標準のLINQを使用して行われるべき投影、すなわちを強制。 NHへのLinqが、(ComputerServices.GetByFontIdがクエリに変換できないメソッドであると仮定すると)あなたの投影をデータベースで完全に行うことができないということを理解するのが難しいかもしれません。

+0

それは働いた。ありがとう! – vanyok

+0

注意! 'f.Fonts'は熱心にフェッチされない関連を意味するので、潜在的な' SELECT N + 1'問題があります。常にSQLプロファイラまたはNHProfなどのクエリを使用して、クエリが実行可能であることを確認してください。 :-) – Rytmis

関連する問題