1

私はEntity Framework 4.1のコードの最初のアプローチを使用して、一連のテーブルにクラス階層をマッピングしています。テーブル単位のマッピングのレベルを1つだけクエリするにはどうすればよいですか?

は、私は以下のクラスが定義されている:

[Table("FooBases")] 
public class FooBase 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[Table("Foo1s")] 
public class Foo1 : FooBase 
{ 
    public string Details { get; set; } 
} 

[Table("Foo2s")] 
public class Foo2 : FooBase 
{ 
    public string Description { get; set; } 
} 

だから、これは一般的なプロパティ(idとname)が FooBaseテーブルに格納されている3つのテーブルを作成します。

特定のケースでは、FooBaseオブジェクトの名前のリストのみに興味があります。それがFoo1Foo2かどうかは気にしません。私は、新しいデータコンテキストをスピンアップし、このようなクエリを実行します。

var names = ctx.Set<FooBase>().Select(f => f.Name); 

さて、私はFoo1sFoo2sテーブルを照会するオーバーヘッドを必要としません。私はクエリが単なるSELECT Name FROM FooBasesであることを期待しています。代わりに、私はこれを取得します:

SELECT 
[Extent1].[Name] AS [Name] 
FROM [dbo].[FooBases] AS [Extent1] 
LEFT OUTER JOIN (SELECT 
    [Extent2].[Id] AS [Id] 
    FROM [dbo].[Foo1s] AS [Extent2] 
UNION ALL 
    SELECT 
    [Extent3].[Id] AS [Id] 
    FROM [dbo].[Foo2s] AS [Extent3]) AS [UnionAll1] ON [Extent1].[Id] = [UnionAll1].[Id] 

私は他のテーブルを気にしないということをEntity Frameworkに伝える方法はありますか?クラス階層のトップレベルのデータが必要なだけなので、トップレベルのテーブル以外のものをクエリする必要はありません。

答えて

2

これは、テーブルごとの継承マッピングを使用したwell known issueです。それはupcoming EFv4.2で対処する必要がありますimprove the query generation for TPT inheritanceする必要があります。現時点では改善の余地がありません。

+0

優秀!ありがとうラディスラフ。それが固定されていることを知ってうれしい。 –