Entity Framework LINQを使用して、すべての親テーブルに対して親クラスを返し、複数の具体的な実装のいずれかを持つ親クラスのプロパティインターフェイスの。どの具体的な実装は、親テーブルのフィールドの値に基づいてクエリ時に決定されるべきですか。EF4具体的な型をインターフェイスにキャストできません
非常に単純な例では、3つのテーブルと3つの対応するPOCOがあります。
例
例のためにシンプルなクラス
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 は、エンティティデータモデルプリミティブ型のキャストのみサポートしています。
これは、両方のクラスをモデルの一部である基本クラスから派生させる場合にのみ、このように行うことができます。 –
:(残念なことに、あなたは正しいと思われます。回答として投稿すると、私はそれを受け入れます。 –