2011-06-22 12 views
0

これは愚かな質問かもしれません。 Entity Framework Code Firstを使用しています。多対多の関係を持つ2つのクラス、UserとEventがあります。 EFがデータベーステーブルを生成するとき、私はUsers_Eventsと呼ばれる結合テーブルを作成します。この表には、User_IDとEvent_IDの2つの列があります。これまではすべてが問題ありません。LINQを使用した結合テーブルの照会

データベースからイベントを取り出し、JSONにシリアル化したいとします。イベントのユーザーを呼び出すことができない場合を除いて、これは完全に機能します。これは、循環参照を作成するためです。私がここでやりたいことは、私のテーブルを照会して、関連付けられたEvent_IDを持つすべてのUser_IDを、私がシリアル化しているイベントのIDと等しくすることです。

どうすればいいですか?

+0

私は、あなたが予期していたように非常にうまく動作するかどうか分かりません。あなたが既にそれを試してみて、それがナビゲーション可能なコレクションをシリアライズしていたら、私の申し訳はありませんが、LINQからSQLへのこのような動作は経験しませんでした(EF4.1がはるかに違うと思います) 。私は明示的にロードオプションを指定して、シリアライズ前に関連するコレクションを取得しなければなりませんでした。シリアル化されたデータの関連するレコードを正しく整形する方法の詳細については、[このMSDNの記事](http://msdn.microsoft.com/en-us/library/bb896272.aspx)を参照してください。 – lsuarez

+0

明示的に指定しなくても、関連オブジェクトをシリアライズしません。イベントをシリアライズします。私はイベントのユーザーをシリアル化したい。イベントのユーザーイベントをシリアル化する(循環参照を作成する)ことは望ましくありません。私が明示的に(.Include( "Users")を使用して)ユーザーを含めると、ユーザーおよびそのナビゲート可能なすべてのプロパティーも、ユーザーのイベントを含めてシリアル化されます。 – OpticalDelusion

答えて

3

私はあなたのJSONで何をしたいのか分かりませんが、新しい匿名型を選択してその代わりにシリアル化したいと思っています。これらの線に沿ったものは、多分:

from e in myContext.Events 
where e.ID = 123 
select new { 
    Event = e, 
    UserIDs = (from u in e.Users select u.ID) 
} 
+0

私のクラスはかなり大きく、匿名型を作成するのは非常に面倒でコードが重いですが、おそらく多分です。 – OpticalDelusion

+0

イベントをラップする別のアプローチを提供するために私の答えを編集しました。ここでもJSONをどのように見せたいかによって異なりますが、これは私が使用するアプローチの一種です。 –

+0

もう一つの答えは、JSONシリアライザの機能を見ることです。私は.NETのバージョンについてはわかりませんが、Newtonsoftには[自己参照ループを扱う機能]があります(http://james.newtonking.com/projects/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm) 。 –

関連する問題