2012-10-01 13 views
5

Entity Framework LINQを使用して、すべての親テーブルに対して親クラスを返し、複数の具体的な実装のいずれかを持つ親クラスのプロパティインターフェイスの。どの具体的な実装は、親テーブルのフィールドの値に基づいてクエリ時に決定されるべきですか。EF4具体的な型をインターフェイスにキャストできません

非常に単純な例では、3つのテーブルと3つの対応するPOCOがあります。

Three Tables: Master and two children

例のためにシンプルなクラス

internal interface IConfiguration 
{ 
} 

internal class ConfigurationContainer 
{ 
    public IConfiguration Config { get; set; } 
} 

internal class ConfigurationSouth : IConfiguration 
{ 
} 

internal class ConfigurationNorth : IConfiguration 
{ 
} 

残念ながら、すべての親の結果を通じてIループおよび決定のためにシンプルなテーブルループ内で使用するサブクエリ何かのようにこのブロック。

foreach (var configMaster in db.ConfigMasters.ToList()) 
{ 
    var configContainer = new ConfigurationContainer(); 
    if (configMaster.IsNorth) 
     configContainer.Config = (from x in db.ConfigNorths 
          select new ConfigurationNorth()) 
             .FirstOrDefault(); 
    else 
     configContainer.Config = (from x in db.ConfigSouths 
          select new ConfigurationSouth()) 
             .FirstOrDefault(); 
} 

サブクエリを実行するための各親レコードのルーピングは最適ではありません。私は実際にEF LINQがデータベースへの1回の旅行でクエリを実行するだけでなく、POCOへの予測を実行したいと思います。

このLINQは、1回のトリップでデータベースにクエリを行い、投射されたオブジェクトを返して、クエリ時に2つのサブクエリのいずれかによってConfigプロパティが設定されるようにしました。それはコンパイルされますが、実行時に例外がスローされます。

using (var db = new Entities()) 
{ 
    var qry = from cfgMaster in db.ConfigMasters 
       let configNorth = (from x in db.ConfigNorths 
            select new ConfigurationNorth()) 
        .FirstOrDefault() 
       let configSouth = (from x in db.ConfigSouths 
            select new ConfigurationSouth()) 
        .FirstOrDefault() 
       select new ConfigurationContainer() 
        { 
         Config = cfgMaster.IsNorth ? configNorth : (IConfiguration) configSouth 
        }; 

    var results = qry.ToList(); 
} 

例外

未処理の例外:System.NotSupportedException: 'EFTest.IConfiguration' を入力する 型 'EFTest.ConfigurationNorth' をキャストすることができません。エンティティへのLINQ は、エンティティデータモデルプリミティブ型のキャストのみサポートしています。

+0

これは、両方のクラスをモデルの一部である基本クラスから派生させる場合にのみ、このように行うことができます。 –

+0

:(残念なことに、あなたは正しいと思われます。回答として投稿すると、私はそれを受け入れます。 –

答えて

1

エンティティフレームワークは、基本的にインターフェイスがモデルに登録されていない(およびできない)ため、この方法でインターフェイスの使用をサポートしていません。あなたが望むのは、両方のクラスをモデルの一部である基底クラスから派生させるときだけです。

関連する問題