7

したがって、クラス階層を持つ型を持つナビゲーションプロパティを持つエンティティがあります。私はThePropertyがタイプChildSubClassであり、InterestingPropertyが特定の値を有する場合、私の質問のいずれかの条件があることで、ParentClassエンティティを照会することができますどのようにEntity Framework - ナビゲーションプロパティの継承型を指定するクエリ

class ParentEntity 
{ 
    virtual ChildEntity TheProperty { get; set; } 
    virtual string AnotherProperty { get; set; } 
    virtual string AnotherProperty2 { get; set; } 
} 

class ChildEntity 
{ 
} 

class ChildSubEntity : ChildEntity 
{ 
    virtual string InterestingProperty { get; set; } 
} 

(エンティティ名は有罪を保護するために変更しましたか)?私は

ObjectContext context = GetContext(); 
var result = context.ParentEntities. 
    Where(e => e.AnotherProperty == AnotherInterestingValue). 
    Where(e => e.TheProperty is ChildSubEntity). 
    Where(e => ((ChildSubEntity)e.TheProperty). 
    InterestingProperty == InterestingValue). 
    ToList(); 

を試してみましたが、エラーを取得しました

「タイプをキャストすることができません 『ChildEntityは』 『ChildSubEntity』を入力する。LINQのエンティティへの唯一のエンティティデータモデルのプリミティブ型のキャストをサポートしています。」。

リストを平坦化し、エンティティストアからデータを取得した後でこの条件を適用する必要があります。エンティティが受け入れるようにLINQの形式でこの条件を書くことは可能ですか?

明らかに、これは単純化していますが、私は実際にはLinqKitを使用してクエリ式を構築し、ParentEntityのプロパティ、ParentEntityのプロパティ、その他の条件の条件のいくつかをプログラムで作成していますParentEntityの子エンティティ

答えて

14

OfTypeを正しく使用する必要があります。LINQ to Entitiesで解決しました。それをChildEntityコレクションに対して使用し、選択したChildEntityオブジェクトに関連するParentEntitiesを選択します。

ObjectContext context = GetContext(); 
var result = context.ChildEntities.OfType<ChildSubEntity> 
.Where(e => e.InterestingProperty == InterestingValue) 
.SelectMany(e = > e.ParentEntity) 
.ToList(); 
+0

しかし、私はParentEntityに関する他の多くの基準を満たしていなければなりません。私はそれを明確にするために質問を編集します。 – SamStephens

+0

'ParentEntity'をフィルタリングするために' SelectMany'に 'Where'を追加してください –

+0

ああ、今は*面白いです。私は演劇を持って、あなたに戻ってきます。 – SamStephens

関連する問題