0

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行をプルバックする必要がある場合、プルすることになるため、クエリが煩雑になります(非効率的になります)。あまりにも多くの行を戻すか、十分に引き戻さず、余分なクエリを実行する必要があります。

他に何か考えはありますか?

4

1 に答える 1

1

問題はほとんどありません。まず第一に、識別子をプロパティとしてマップすることはできません。Type1これが、列を探す理由ですType。最初の列は既にクラスの .NET 型にマップされているため、プロパティは 2 番目の列になります。派生型をフィルター処理する唯一の方法は、 を使用することOfTypeです。

すべての B に対してクエリを実行し、それらをフィルター処理された As のクエリの結果と連結する必要があるため、作成するクエリは非常に複雑になる可能性があります。ほとんどの場合、B のインスタンスを As と連結することはできないため、それらを親の型に戻す必要があります。

于 2012-11-26T12:37:01.073 に答える