【发布时间】:2012-12-19 23:45:32
【问题描述】:
使用 Entity Framework LINQ,我想为每个父表返回一个父类,并使用接口的多个具体实现之一在父类上填充一个类型为接口的属性。查询时应该根据父表中某个字段的值来确定具体的实现方式。
在一个非常简化的示例中,我有 3 个表和 3 个对应的 POCO。
为了示例而简单的表格
为了示例而简单的类
internal interface IConfiguration
{
}
internal class ConfigurationContainer
{
public IConfiguration Config { get; set; }
}
internal class ConfigurationSouth : IConfiguration
{
}
internal class ConfigurationNorth : IConfiguration
{
}
不幸的是,我遍历所有父结果并确定在循环内使用哪个子查询。 喜欢这个块。
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 能够在一次访问数据库中执行查询,以及对我的 POCO 进行预测。
我想出了这个 LINQ 来一次查询数据库并返回投影对象,这样 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.ConfigurationNorth”以键入“EFTest.IConfiguration”。 LINQ to Entities 仅支持转换实体数据模型基元类型。
【问题讨论】:
-
只有当你让两个类都派生自一个也是模型一部分的基类时,才能这样做。
-
:( 不幸的是,看来您是正确的。如果您将其发布为答案,我会接受。
标签: .net entity-framework-4 linq-to-entities polymorphism