gpt4 book ai didi

.net - EF4 无法将具体类型转换为接口(interface)

转载 作者:行者123 更新时间:2023-12-04 21:47:10 24 4
gpt4 key购买 nike

使用 Entity Framework LINQ,我想为每个父表返回一个父类,并使用接口(interface)的多个具体实现之一在父类上填充一个类型为接口(interface)的属性。查询时根据父表中某个字段的值来确定具体的实现方式。

在一个非常简化的示例中,我有 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
{
}

不幸的是,我遍历所有父结果并确定在循环内使用哪个子查询。东西 喜欢 这个 block 。
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();
}

异常(exception)

Unhandled Exception: System.NotSupportedException: Unable to cast the type 'EFTest.ConfigurationNorth' to type 'EFTest.IConfiguration'. LINQ to Entities only supports casting Entity Data Model primitive types.

最佳答案

Entity Framework 不(还?)支持以这种方式使用接口(interface),主要是因为接口(interface)没有(也不能)向模型注册。只有当你让两个类都派生自作为模型一部分的基类时,你想要的才有可能。

关于.net - EF4 无法将具体类型转换为接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com