私は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
オブジェクトの名前のリストのみに興味があります。それがFoo1
かFoo2
かどうかは気にしません。私は、新しいデータコンテキストをスピンアップし、このようなクエリを実行します。
var names = ctx.Set<FooBase>().Select(f => f.Name);
さて、私はFoo1s
とFoo2s
テーブルを照会するオーバーヘッドを必要としません。私はクエリが単なる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に伝える方法はありますか?クラス階層のトップレベルのデータが必要なだけなので、トップレベルのテーブル以外のものをクエリする必要はありません。
優秀!ありがとうラディスラフ。それが固定されていることを知ってうれしい。 –