5

私は基本クラスと2つの派生クラスを持っています。Entity Frameworkは派生クラスを照会しません - DbOfTypeExpressionのエラー

それぞれの派生クラスは、プロパティと同じ型を実装しています。唯一の違いはプロパティ名です。

悲しいことに、悲しいことに、私はクラスデザインに大きな影響を与えません - >それらはwsdlファイルから生成されています。

次に、共通プロパティをカプセル化するためのBaseTypeプロパティを持っています。 、次のクエリは絶対に正常に動作します私のMVCコントローラで

public class FruitBase 
    { 
     public virtual int ID { get; set; } 


     // 
     // The plan is to use this property in mvc view 
     // 
     [NotMapped] 
     public virtual FruitnessFactor Fruitness 
     { 
      get 
      { 
       if (this.GetType().BaseType == typeof(Apple)) 
        return ((Apple)this).AppleFruitness; 
       else if (this.GetType().BaseType == typeof(Orange)) 
        return ((Orange)this).OrangeFruitness; 
       else 
        return null; 
      } 
     } 
    } 

public class FruitnessFactor { } 

:計画は、私は、問題を示すために、有名な「フルーツ-例」を使用している

など私のWebビューで、このプロパティを使用していました:

return View(context.FruitEntities 
          .OfType<Apple>().Include(a =>a.AppleFruitness) 
          .ToList()); 

しかし、これはしません:私は取得

return View(context.FruitEntities 
            .OfType<Apple>().Include(a =>a.AppleFruitness) 
            .OfType<Orange>().Include(o => o.OrangeFruitness) 
            .ToList()); 

エラーメッセージがあります:

DbOfTypeExpressionには、type引数と互換性のある多型の結果の型を持つ式の引数が必要です。

私はEF 5.0 RCとコードファーストアプローチを使用しています。

ご協力いただきありがとうございます。

+3

このコードはかなり厄介ですが、投影を使用せずに直接アプローチが成功せず、数回のために頼まれました表現は 'Orange'が' Apple'であることを意味します – Eranga

+0

私のFruitEntitiesを 'DbSet FruitEntities'という表現は、オレンジとアップルが果物であることを意味していますか? – Flo

+0

'OfType'チェーンには、「FruitEntitiesのすべてのリンゴをフィルタリングし、その結果からフィルタリングして、オレンジであるすべてのリンゴ」が表示されます。これは、オレンジがリンゴである場合のみ意味を持ちます。つまり、' Orange'クラスは 'Apple'クラスから継承されます。あなたはそのクエリで何を達成したいですか?オレンジとリンゴの組み合わせリスト、つまりリンゴ**または**オレンジのすべての果物? – Slauma

答えて

7

私が言う限り、Includeを単一のデータベースクエリの複数のサブタイプに適用することはできません。 1つのタイプ(OfType<Apple>().Include(a => a.AppelFruitness))と別のタイプのものを照会することができます。問題は、結果のコレクションに異なるジェネリックタイプ(リンゴやオレンジ)があるため、同じクエリで結果を連結できないことです。

2つのクエリを実行して、結果セットを新しいタイプのベースタイプにコピーすることができます。これは、あなたの質問の下のコメントセクションにすでに示されています。

もう1つのオプション(単一のクエリのみが必要)は投影法です。そうしないと

List<FruitViewModel> fruitViewModels = context.FruitEntities 
    .OfType<Apple>() 
    .Select(a => new FruitViewModel 
    { 
     Fruit = a, 
     Factor = a.AppleFruitness 
    }) 
    .Concat(context.FruitEntities 
    .OfType<Orange>() 
    .Select(o => new FruitViewModel 
    { 
     Fruit = o, 
     Factor = o.OrangeFruitness 
    })) 
    .ToList(); 

:あなたは、クエリを使用することができ、その後...(あなたはまた、匿名型に突出できる)

public class FruitViewModel 
{ 
    public FruitBase Fruit { get; set; } 
    public FruitnessFactor Factor { get; set; } 
} 

を投影型を定義する必要が...となり...変更エンティティはあなたがViewModelにコレクションから果物を抽出できることを意味文脈(「リレーションシップ・フィックスアップ」)に執着するときナビゲーションプロパティが自動的に読み込まれます(AsNoTrackingを使用して)追跡を無効

IEnumerable<FruitBase> fruits = fruitViewModels.Select(fv => fv.Fruit); 

... FruitnessFactorなどの果物が得られます。なぜなら、あなたのこれは多分

+0

私は2つのクエリソリューションに向いていると思います。ソート、ページネーションなどを行う必要があることを考慮すれば、パフォーマンスの影響が懸念されます。しかし、これまでのところよく見えています。乾杯! – Flo

関連する問題