Entity Frameworkを使用して、私は同じテーブルにマップするクラスの階層を持っています。 Cat : Animal
、Dog : Animal
、Goat : Animal
のようなものです。エンティティフレームワークコードfirst - オブジェクトの型が定義済みのリスト内にあるテーブルからオブジェクトを選択します。
もちろん、EFは内部でDiscriminatorカラムを使用してそれらを処理します。 SQLは、LINQツー.GetType()
をサポートしていないとして、当然のことながら
var houseAnimals = new List<Type>(new [] { typeof(Cat), typeof(Dog) });
this.dataRepository.Animals.Where(a => houseAnimals.Contains(a.GetType()));
、これは動作しません。
は今、私のような何かを書きたいです。しかし、これは動作します:
this.dataRepository.Animals.Where(a => a is Cat);
このリストは実行時に動的に構築されているので、私はa is Cat || a is Dog
を行うにはしたくありません。
this postに基づいて、私はEFが 'Discriminator in'ステートメントを備えたSQLクエリに変換することを理解しています。それで、これは私が必要とすることができるという希望を与えてくれます。これは:
this.dataRepository.Animals.Where(a => a is **in** houseAnimals);
いいえ、もちろんそのような構文はありません。
質問:私はこれを達成するためにどのような構文を使用できますか?私はここに何かを逃していますかこれはEFに欠けている機能ですか?このような質問をしたかった唯一の人になることはできません。
この例では、私が必要としていることを説明するために単純化しているので、私のアプローチとこのクエリの実行の必要性をciritizeしないでください。 .ToList()
を行うこともオプションではありません。
Discriminatorの列が私の場合は非常に疲れていて、本当に必要な場合にのみ使用します。 SQLにはプライマリキーと外部キーの関係があります。この種の継承マッピングを使用すると、さまざまな問題が発生する可能性があります。 –
Discriminatorカラムは明示的に使用しません。 –
さて、言い換えると、私はSQLでC#オブジェクトの継承マッピングを使用することに非常に疲れています。 –