2017-02-01 2 views
0

多くの記事は、Entity Frameworkクエリを使用してデータを取得する方法を示しています。あなたは下の表の構造を考える場合は、:テーブルタイプごとのデータ取得

Table Per Type sample

私は単なるSQLを使用してID 2と車の詳細を知りたい場合は、私はすべての継承に一致するものを探すためにIDを使用する必要がありますテーブル(この例では "Used Car"と "New Car")?

「中古車」テーブルを「新車」テーブルで見つける前にフルスキャンを実行しませんか?それとも、「新車」のテーブルに直接行かなければならないか分かりましたか?

Table-Per-Typeデザインが間違っていると私は想定していますか?

+1

TPTが特定のIDのデータを含む「派生」テーブルを直接知る方法はありません。情報は常に結合で抽出されます。 「EFコードで継承する:第2部 - タイプごとのテーブル(TPT)」の** TPTの考慮事項**セクションを参照してください(https://weblogs.asp.net/manavi/inheritance-mapping-strategies-withentity-framework -code-first-ctp5-part-2-table-per-type-tpt) –

+0

@IvanStoevありがとう。 1レベルの継承の場合、1つの基本テーブルがあり、10の直接の子テーブルがあると、パフォーマンスは問題になりますか?私は、複数のレベルの継承がある場合、パフォーマンスは問題になると思います。私の理解は正しいのですか? – Ayusman

+0

IMO、はい。私はリンクからシリーズ全体を読むことをお勧めします、著者はそれぞれの長所と短所を持つ3つのEF継承戦略を詳細に説明します(どれも理想的ではありません)。 –

答えて

2

あなたが今年見つけたい場合は、あなたが行う可能性があります:

select c.*, coalesce(uc.year, nc.year) as year, 
     (case when uc.id is not null then 'Used' else 'New' end) as which 
from car c left join 
    usedcar uc 
    on c.id = uc.id left join 
    newcar nc 
    on c.id = nc.id 
where c.id = 2; 

(私はcarIdそれに名前を付けるだろうが)あなたはすべてのテーブルの主キーとしてidを宣言する必要があります。それからスキャンは行われません。インデックス検索だけ。

つまり、デザインは問題ありません。自動車が新しいか、使用されているかを確認するためには、さまざまな制約が必要ですが、両方を行うことはできません。

+0

どうもありがとうございます。この部分が何をしているのか説明してください。「coalesce(uc.year、nc.year)年、 (uc.idがnullでない場合、 'Used' else 'New' end )と "なぜ2つの左結合があるのか​​? – Ayusman

+0

心配しないで、私はそれを得た。そしてもう一度助けてくれてありがとう。 – Ayusman

関連する問題