0

Entity Framework 経由でデータベースにアクセスする場合、次の 3 つのエンティティを使用できます。

  • stt_dictionary
  • stt_concept
  • stt_term

これらの各エンティティには、4 番目のエンティティ stt_change_log のコレクションがあります。

たとえば、

stt_dictionary.stt_change_log = ICollection<stt_change_log>

これらの上位 3 つの要素と stt_change_log の関係は次のとおりです。

stt_change_log.element_id = (stt_dictionary | stt_concept | stt_term).id;

ただし、stt_dictionary、stt_concept、および stt_term はすべてID タイプとしてintを持っているため、次も必要です。

stt_change_log.element_type_id = (7 | 8 | 9)

ここで、以下のようなクエリを実行すると、指定された ID を持つすべての stt_change_log エンティティが返されます。つまり、stt_dictionary.id = 1 のときに stt_change_log エンティティが必要な場合、ID もある stt_concept および stt_term エンティティに関連する stt_change_log エントリも取得します。 = 1. つまり、stt_change_log コレクションには追加のフィルタリングが必要です。

var daoDictionary = (from d in db.stt_dictionary
                         .Include("stt_change_log.stt_change_types")
                     where d.id == id
                     select d).FirstOrDefault();

stt_change_log コレクション内の各アイテムの element_type_id プロパティの値を指定して、stt_change_log エンティティをフィルタリングするにはどうすればよいですか?

また、これを 1 つのクエリで実行することを意図していることも付け加えておきます。

4

2 に答える 2

1

最善の選択肢は、ログ エンティティにテーブルごとの階層 (TBH) 継承マッピングを使用することです。ベース エンティティ stt_change_log を定義してから、ログの種類ごとにエンティティ クラスを派生させます。stt_change_type が識別子になります。

次に、「メイン」エンティティのそれぞれが、そのエンティティに固有のログ タイプを参照し、フィルタリングが魔法のように行われます ;)

開始するには、次のチュートリアルをお読みください。

http://msdn.microsoft.com/en-us/data/jj618292

あなたの状況では、派生エンティティに追加のプロパティは必要ないことに注意してください。コードを最初に使用している場合は、「最初に階層コードによる表」を検索してください。ここに簡単な準備があります:http://blogs.msdn.com/b/wriju/archive/2011/05/17/code-first-ef-4-1-table-per-hierarchy.aspx

于 2013-03-26T18:07:40.237 に答える
1

残念ながら、.Include はフィルタリングを許可しません。

プロジェクションを使用してサーバーサイズのフィルタリングを実行するか、必要に応じて項目を遅延読み込みできます。

また、その機能が将来含まれるように投票することもできます。

于 2013-03-26T17:31:58.963 に答える