AChildとBChildの2つのサブクラスを持つクラスParentがあるとします。これらは、TPHを使用して.NET4.5上のEntityFramework5.0.0を使用して単一のテーブルにマップされています。
public abstract class Parent {
public string Type { get; set; } // Column with this name in DB is discriminator.
public string Status { get; set; }
}
public class AChild : Parent {
// Other stuff.
}
public class BChild : Parent {
// Other stuff.
}
マッピングを構成するコード:
class ParentConfiguration : EntityTypeConfiguration<Parent> {
Map((EntityMappingConfiguration<AChild> mapping) => mapping
.Requires("Type")
.HasValue("A"));
Map((EntityMappingConfiguration<BChild> mapping) => mapping
.Requires("Type")
.HasValue("B"));
}
AChildオブジェクトとBChildオブジェクトの両方を返すクエリを実行する必要があります。ただし、2番目の列でAChild行のみをフィルタリングする必要があります。この例では、これをStatusと呼びます。
理想的には、次のことを行いたいと思います。
public IList<Parent> RunQuery() {
IQueryable<Parent> query =
this.context.Set<Parent>()
.Where((Parent parent) => !parent.Type.Equals("A") || parent.Status.Equals("Foo"))
.OrderBy((Parent parent) => parent.Number);
return query.ToList();
}
これは機能しません。ディスクリミネーターと「Type」プロパティの両方を同じ「Type」列にマップするのではなく、「Type1」列を探すことを主張しました。
1つのタイプに完全にフィルターするために使用できる「OfType」拡張メソッドを知っていますが、この場合、それは広すぎます。
複数のクエリを実行して結果を組み合わせることができますが、構築している実際のシステムはページングを実行しているため、10行をプルバックする必要がある場合、プルすることになるため、クエリが煩雑になります(非効率的になります)。あまりにも多くの行を戻すか、十分に引き戻さず、余分なクエリを実行する必要があります。
他に何か考えはありますか?