使用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仅支持转换实体数据模型基元类型。
答案 0 :(得分:1)
实体框架(还没有?)以这种方式支持接口的使用,主要是因为接口不是(并且不能)注册模型。只有当你让这两个类派生自作为模型一部分的基类时,才能实现你想要的。