私は現在、階層ごとのテーブルを使用して単一のテーブルを使用してクラスの 1 つのセットを表すプロジェクトで Entity Framework 4 を使用しています。これが機能する方法は、このテーブルが状態を表し、さまざまな状態がさまざまな他のクラスに関連付けられていることです。
したがって、すべての州が共有する共通のフィールドを無視すると、次のように見えると想像できます。
InactiveState
has a -> StateStore
ActiveState
has a -> ActivityLocation
CompletedState
has a -> CompletionDate
各状態には、それに属するすべての InventoryItems のコレクションがあります。
現在、インベントリ内の各アイテムには多くの状態があり、履歴の最後のものが現在の状態です。リストに保存するために、インベントリの現在の状態を指すショートカット フィールドがあります。
public class InventoryItem : Entity
{
// whole bunch of other properties
public virtual ICollection<InventoryState> StateHistory { get; set; }
public virtual InventoryState LastState { get; set; }
}
私が抱えている最初の問題は、たとえば、Active
状態にあるすべての InventoryItems を見つけたいときです。
Linq-To-Entities は GetType() をサポートしていないことが判明したため、 のようなステートメントは使用できませんInventoryRepository.Get().Where( x => x.LastState.GetType() == someType )
。演算子を使用できis
ますが、次のようなメソッドを持つことができるのではなく、固定型が必要です。
public ICollection<InventoryItem> GetInventoryItemsByState( Type state )
{
return inventoryRepository.Get().Where( x => x.LastState is state );
}
Linq クエリを作成する前に、型に基づいて何らかの if ステートメントを実行する必要がありますが、これは間違っていると感じています。InventoryItem リストは大きくなる可能性が高いため、これを EF レベルで行う必要があります。たとえば、リスト全体をメモリに取り込んで GetType() を使用することはできません。
この状況で 2 つの質問がありますが、これらはおそらく私の側の理解不足を反映しているため、組み合わせることができるほど密接に関連していると思います。
- Linq To Entities を使用して、子テーブル タイプを共有するアイテムのリストを見つけることは可能ですか?
- 遅延読み込みを使用していない
Include
場合、TPH を使用して子テーブル タイプのアイテムを関連付けることは可能ですか?